hdu1712: http://acm.hdu.edu.cn/showproblem.php?pid=1712
题意:输入课程数n和总天数m,再输入矩阵n*m,v[i][j]表示花费j天在课程i上得到价值为v[i][j]
解法:分组背包问题:组数为n,总容量为m,每件物品费用为c[i]=j,价值为w[i]=v[i][j]
code:
#include<iostream>
#include<cstdio>
#include<cstdlib>
int max(int a,int b)
{
if(a>b)
return a;
else
return b;
}
int f[120],v[120][120];
int main()
{
int n,m;
while(1)
{
scanf("%d%d",&n,&m);
if(n==0&&m==0)break;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&v[i][j]);
}
}
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++) //枚举各组
{
for(int j=m;j>=0;j--) //类似01背包
{
for(int k=1;k<=m;k++) //枚举组内各物品
{
if(j>=k) //k也为费用
{
f[j]=max(f[j],f[j-k]+v[i][k]);
}
}
}
}
printf("%d\n",f[m]);
}
}
/*input:
2 2
1 2
1 3
2 2
2 1
2 1
2 3
3 2 1
3 2 1
0 0
output:
3
4
6
*/