刚刚接触到分组背包的模型。
这题作为入门题目非常适合。
分组背包。
一个容量为V的背包,还有若干组物品,每组包含若干物品,这些物品各不相同,而且体积w和价值p各不相同。组内的物品相冲突。求出能在不超过V的情况下尽可能的使价值最大。
题意:n门课,m天时间,完成a[i][j]得到的价值为第i行j列的数字,求最大价值。
思路:分组背包,就是第n门课程,可以做一天,可以做两天,也可以不做。也就是说在每一组中你只能取一个。
#include<bits/stdc++.h>
#define debug(a) cout << #a << " " << a << endl
#define LL long long
#define PI acos(-1.0)
#define eps 1e-6
const int N=100+7;
int dp[N];
int a[N][N];
using namespace std;
int main ()
{
//yyy_3y
//freopen("1.in","r",stdin);
int n,m;
while (scanf("%d%d",&n,&m)!=EOF && n+m){
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
for(int i=1;i<=n;i++){
for(int j=m;j>=0;j--){
for(int k=1;k<=j;k++)
dp[j]=max(dp[j],dp[j-k]+a[i][k]);
}
}
printf("%d\n",dp[m]);
}
return 0;
}