转载请注明出处:http://blog.csdn.net/u012860063
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3033
5 10000 3 1 4 6 2 5 7 3 4 99 1 55 77 2 44 66
255
分组背包
代码如下:
#include <cstdio>
#include <cstring>
int max(int a,int b)
{
if(a > b)
return a;
return b;
}
struct M
{
int m,v;
}m[17][147];
int main()
{
int i,j,k,KK,N,MM;
int num[147],dp[11][10047];
int vv,mm;
while(~scanf("%d%d%d",&N,&MM,&KK))
{
memset(num,0,sizeof(num));
memset(dp,-1,sizeof(dp));
for(i = 0 ; i < N ; i++)
{
scanf("%d%d%d",&k,&mm,&vv);
m[k][num[k]].m = mm;
m[k][num[k]].v = vv;
num[k]++;
}
for( i = 0 ; i <= MM ;i++)
{
dp[0][i] = 0;
}
for(k = 1 ; k <= KK ; k++)
{
for( i = 0 ; i < num[k] ; i++)
{
for(j = MM ; j >= m[k][i].m ; j--)
{
if(dp[k][j-m[k][i].m] != -1)
{
dp[k][j] = max(dp[k][j],dp[k][j-m[k][i].m]+m[k][i].v);
}
if(dp[k-1][j-m[k][i].m] != -1)
{
dp[k][j] = max(dp[k][j],dp[k-1][j-m[k][i].m]+m[k][i].v);
}
}
}
}
if(dp[KK][MM] == -1)
printf("Impossible\n");
else
printf("%d\n",dp[KK][MM]);
}
return 0;
}
hdu3033 I love sneakers!分组背包,布布扣,bubuko.com
原文:http://blog.csdn.net/u012860063/article/details/34134243