标签:背包dp
2 2 1 2 1 3 2 2 2 1 2 1 2 3 3 2 1 3 2 1 0 0
3 4 6
这题是分组背包,对于每一门课,有m种天数的选择,而且选一天和选两天是互斥的,就是说要么不选,要么选k天,所以就在01背包基础上多加一个循环,注意次序,m循环要在k之前,这样才不会发生一门科目重复选多天的情况。
#include<stdio.h> #include<string.h> int max(int a,int b){ return a>b?a:b; } int v[106][106],dp[106]; int main() { int n,m,i,j,k; while(scanf("%d%d",&n,&m)!=EOF) { if(n==m && n==0)break; for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ scanf("%d",&v[i][j]); } } memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++){ for(j=m;j>=1;j--){ for(k=1;k<=m;k++){ if(j>=k && dp[j]<dp[j-k]+v[i][k]){ dp[j]=dp[j-k]+v[i][k]; } } } } printf("%d\n",dp[m]); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:背包dp
原文地址:http://blog.csdn.net/kirito_acmer/article/details/46710163