P1757 通天之分组背包 / hdu1712 ACboy needs your help (分组背包入门)
hdu1712题意:A[i][j]表示用j天学习第i个课程能够得到A[i][j]的收益,求m天内获得的收益最大值,一天只能上一节课(转)。
分组背包套路:
for(int i=1;i<=组数;++i) for(int j=容量;j>=0;--j) for(int k=1;k<=第i组元素个数;++k) …………
保证一组只选<=1个
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define re register 5 using namespace std; 6 int max(int &a,int &b){return a>b?a:b;} 7 int n,m,a[102][102],f[102]; 8 int main(){ 9 while(~scanf("%d%d",&n,&m)){ 10 if(!n&&!m) break; 11 for(re int i=1;i<=n;++i) 12 for(re int j=1;j<=m;++j) 13 scanf("%d",&a[i][j]); 14 memset(f,0,sizeof(f)); 15 for(re int i=1;i<=n;++i) 16 for(re int j=m;j>=0;--j) 17 for(re int k=1;k<=j;++k) 18 f[j]=max(f[j],f[j-k]+a[i][k]); 19 printf("%d\n",f[m]); 20 }return 0; 21 }
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define re register 5 using namespace std; 6 int max(int &a,int &b){return a>b?a:b;} 7 int n,m,f[1002]; 8 int len[1000],a[1002][1002],b[1002][1002]; 9 int main(){ 10 int q1,q2,q3,mc; 11 while(~scanf("%d%d",&m,&n)){ 12 memset(len,0,sizeof(len)); 13 memset(f,0,sizeof(f)); 14 mc=0; 15 for(re int i=1;i<=n;++i){ 16 scanf("%d%d%d",&q1,&q2,&q3); 17 mc=max(mc,q3); 18 a[q3][++len[q3]]=q1; 19 b[q3][len[q3]]=q2; 20 } 21 for(re int i=1;i<=mc;++i) 22 for(re int j=m;j>=0;--j) 23 for(re int u=1;u<=len[i];++u) 24 if(j>=a[i][u]) 25 f[j]=max(f[j],f[j-a[i][u]]+b[i][u]); 26 printf("%d\n",f[m]); 27 }return 0; 28 }