ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AreYouBusy (混合背包)

2020-02-05 22:51:22  阅读:172  来源: 互联网

标签:AreYouBusy 背包 int max 分类 混合 任务 include dp


题目大意:有 n 组任务,m 个体力,每组任务有 k 个,分类为 f,每个任务花费 x 体力,得到 y 开心值,求最大开心值,若不能完成输出-1

     分类为 0:这一组中的 k 个任务至少选择一个。

     分类为 1:这一组中的 k 个任务最多选择一个。

     分类为 2:这一组中的 k 个任务随便选择。

 

 

解法:

对于 0 : 其实就是之前做过的分组背包的变形每组至少选一个

对于 1 : 其实就是分组背包

对于 2 : 其实就是 01背包

.对于分类 0,若当前判断到一个任务 x,则有两种情况:

1)它是该组第一个被选择的任务,则它更新的状态只能是将上一层的状态转移更新到当前位置。

2)它不是第一个被选择的任务,则它可以由当前组的状态转移更新到当前位置。

为了方便判断处理第一个任务,初始化当前层为 -inf

2.对于分类 1,因为只能选一个或者不选,则它只能由上一层状态转移更新

3.对于分类 2,就是普通的 01背包问题

 

#include <iostream>
#include <algorithm>
#include <string>
#include <string.h>
#include <vector>
#include <map>
#include <stack>
#include <set>
#include <queue>
#include <math.h>
#include <cstdio>
#include <iomanip>
#include <time.h>

#define LL long long
#define INF 0x3f3f3f3f
#define ls nod<<1
#define rs (nod<<1)+1

using namespace std;

int dp[250][250];
int w[250],v[250];
int n,m,k,vv;

int main(){
    int i,j;
    while(scanf("%d%d",&n,&m)!=EOF){
        memset(dp,0, sizeof(dp));
        for(i=1;i<=n;++i){
            scanf("%d%d",&k,&vv);
            for(j=1;j<=k;++j) scanf("%d%d",&w[j],&v[j]);
            if(vv==0){
                for(int l=0;l<=m;++l)dp[i][l]=-INF;
                for(int l=1;l<=k;++l)
                    for(int h=m;h>=w[l];--h){
                        dp[i][h]=max(dp[i][h],max(dp[i-1][h-w[l]],dp[i][h-w[l]])+v[l]);
                    }
            }
            else if(vv==1){
                for(int l=0;l<=m;++l)dp[i][l]=dp[i-1][l];
                for(int h=m;h>=0;--h)
                    for(int l=1;l<=k;++l)
                        if (h >= w[l])
                            dp[i][h]=max(dp[i][h],dp[i-1][h-w[l]]+v[l]);
            }
            else{
                for(int l=0;l<=m;++l)dp[i][l]=dp[i-1][l];
                for(int l=1;l<=k;++l)
                    for(int h=m;h>=w[l];--h){
                        dp[i][h]=max(dp[i][h],dp[i][h-w[l]]+v[l]);
                    }
            }
        }
        int temp=max(dp[n][m],-1);
        printf("%d\n",temp);
    }
    return 0;
}

 

标签:AreYouBusy,背包,int,max,分类,混合,任务,include,dp
来源: https://www.cnblogs.com/-Ackerman/p/12267121.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有