hdu 3535 AreYouBusy dp

来源:互联网 发布:国内餐饮软件排名 编辑:程序博客网 时间:2024/04/30 10:00
#include<cstdio>#include<cstring>#include<vector>#include<algorithm>using namespace std;const int inf =-0x7f7f7f7f;const int N =110;struct node{int cost;int val;};vector<node>g[N];int dp[N][N];int flag[N];int main(){int n,m;while(scanf("%d%d",&n,&m)!=EOF){for(int i=0;i<=n;i++){g[i].clear();fill(dp[i+1],dp[i+1]+m+1,inf);}int type,num;int r,c;for(int i=1;i<=n;i++){scanf("%d%d",&num,&type);while(num--){scanf("%d%d",&r,&c);node temp;temp.cost=r;temp.val=c;//g[type].push_back(temp);g[i].push_back(temp);flag[i]=type;}}fill(dp[0],dp[0]+m+1,0);for(int i=1;i<=n;i++){if(flag[i]==0){for(int j=0;j<=m;j++){//初始化,如果当前集合一个没选赋值为infdp[i][j]=inf;}for(int j=0;j<g[i].size();j++){node u=g[i][j];for(int h=m;h>=u.cost;h--){dp[i][h]=max(dp[i][h],dp[i][h-u.cost]+u.val);//当前组,在选当前组中的,如果当前组没选则,dp[i][h-u.cost]=inf,得到的值也是<0的。dp[i][h]=max(dp[i][h],dp[i-1][h-u.cost]+u.val);//当前组选一个}}}else if(flag[i]==1){for(int j=0;j<=m;j++){dp[i][j]=dp[i-1][j];//当前组不选}for(int j=0;j<g[i].size();j++){node u=g[i][j];for(int h=m;h>=u.cost;h--){dp[i][h]=max(dp[i][h],dp[i-1][h-u.cost]+u.val);//当前组选一个,前一组+当前选择,确保这一组只能选一个}}}else {for(int j=0;j<=m;j++){dp[i][j]=dp[i-1][j];}for(int j=0;j<g[i].size();j++){node u=g[i][j];for(int h=m;h>=u.cost;h--){dp[i][h]=max(dp[i][h],dp[i][h-u.cost]+u.val);//任意,可选可不选,可选择当前组多个}}}}if(dp[n][m]<0) printf("-1\n");else printf("%d\n",dp[n][m]);}return 0;}

就是背包,刚开始题意理解错了。。。

就是dp[i][h]的含义的问题了,dp[i][h]表示前i组h时间获得(符合条件)的最大值。。保证递推过程中的值是符合条件的就行了。。这里值为inf表示不符合条件,有不符合条件递推来的同样是不符合条件的。

0 0
原创粉丝点击