#include <iostream>
#include <cstdio>
#include <string.h>
WA了好多次,才发现动态转移方程有问题,这大概就是多个选择得到最优值吧
此题类似多重背包,每组至少选一个,代码好乱哇
using namespace std;
int max(int a,int b)
{
if (a>b)
return a;
else
return b;
}
struct node
{
int k,cost,value;
}s[1500];
int dp[15][10005];
int main()
{
int n,k,v,i,j,l;
while(scanf("%d%d%d",&n,&v,&k)!=EOF)
{
memset(dp,0,sizeof(dp));
int flag=0;
for (i=1;i<=n;++i)
scanf("%d%d%d",&s[i].k,&s[i].cost,&s[i].value);
for (i=1;i<=k;++i)
{
for (j=1;j<=n;++j)
if (s[j].k==i)//判断是否属于该组
{
if (v<s[j].cost)//总体积过小
{
printf ("Impossible\n");
flag=1;
break;
}
for (l=v;l>=s[j].cost;--l)
if (dp[i-1][l-s[j].cost]!=0||i==1)//比如2 50 2 1 50 20 2 50 20这种情况,在第一组时已经把钱都用完了,第二组根本没法选
dp[i][l]=max(dp[i][l],max(dp[i-1][l-s[j].cost]+s[j].value,dp[i][l-s[j].cost]+s[j].value));
}
}
if (flag)
continue;
if (dp[k][v]!=0)
printf ("%d\n",dp[k][v]);
else
printf ("Impossible\n");
}
return 0;
}