3 3 2 1 2 5 3 8 2 0 1 0 2 1 3 2 4 3 2 1 1 1 3 4 2 1 2 5 3 8 2 0 1 1 2 8 3 2 4 4 2 1 1 1 1 1 1 0 2 1 5 3 2 0 1 0 2 1 2 0 2 2 1 1 2 0 3 2 2 1 2 1 1 5 2 8 3 2 3 8 4 9 5 10
5 13 -1 -1题目意思:用时T,要求得到最大幸福值。第一行给出两个数n,T,接下来有n个小块,每个小块第一行有两个数m,s,s表示这一小块的类型,为0时表示从中最少要选一个工作,不能不选,为1时表示最多从这一小块中选一个工作,可以不选,为2时表示可选可不选。#include<stdio.h> #include<iostream> #include<string.h> using namespace std; #define N 120 int n0,dp[N][N],T; int max(int a,int b,int c) { if(a<b)a=b; if(a<c)a=c; return a; } void init() { memset(dp,-1,sizeof(dp)); for(int i=0;i<N;i++) dp[0][i]=0; } void count(int ut,int w) { int j,a,b,c; for(j=T;j>=ut;j--) { a=dp[n0][j]; b=dp[n0][j-ut]; c=dp[n0-1][j-ut];//当类型为2时,一定要注意(相当背包里没有放过类型2) if(b!=-1)b+=w; if(c!=-1) c+=w; dp[n0][j]=max(a,b,c); } } void count_1(int ut,int w) { for(int j=T;j>=ut;j--) { if(dp[n0][j]<dp[n0-1][j-ut]+w&&dp[n0-1][j-ut]!=-1) dp[n0][j]=dp[n0-1][j-ut]+w; } } int main() { int n,m,tp,cc,gg,tk; while(scanf("%d%d",&n,&T)>0) { n0=0; init(); while(n--) { n0++; scanf("%d%d",&m,&tp); if(tp!=0) for(int i=0;i<=T;i++) dp[n0][i]=dp[n0-1][i]; while(m--) { scanf("%d%d",&cc,&gg); if(tp==1) count_1(cc,gg); else count(cc,gg); } } printf("%d\n",dp[n0][T]); } }
hdu3535AreYouBusy (分组背包,WA了很多次),布布扣,bubuko.com
hdu3535AreYouBusy (分组背包,WA了很多次)
原文:http://blog.csdn.net/u010372095/article/details/20232989