题目链接
分组背包+vector存结构体
注意循环内外层顺序
#include<cstdio>
#include<algorithm>
#include<vector>
#define INF 0x3f3f3f3f
using namespace std;
int dp[110][10010];
struct node{
int w,v;//价格价值
};
vector<node>s[11];
int main()
{
//freopen("in.txt","r",stdin);
int i,j,l,n,m,k,a,b,c;
while(~scanf("%d%d%d",&n,&m,&k))//产品总数金额运动鞋品牌
{
int f=0;
for(i=1;i<=k;i++)s[i].clear();
for(i=1;i<=n;i++)
{
scanf("%d%d%d",&a,&b,&c);//编号价格价值
node t;
t.w=b;t.v=c;
s[a].push_back(t);
}
for(i=1;i<=k;i++)
if(s[i].size()==0)
{
f=1;break;
}
if(f)
{
printf("%Impossible\n");
continue;
}
for(i=1;i<=k;i++)
for(j=0;j<=m;j++)
dp[i][j]=-INF;
for(i=0;i<=m;i++)
dp[0][i]=0;
for(i=1;i<=k;i++)
for(j=0;j<s[i].size();j++)
for(l=m;l>=s[i][j].w;l--)
{
dp[i][l]=max(dp[i][l],dp[i][l-s[i][j].w]+s[i][j].v);
dp[i][l]=max(dp[i][l],dp[i-1][l-s[i][j].w]+s[i][j].v);
}
if(dp[k][m]<0)printf("Impossible\n");
else printf("%d\n",dp[k][m]);
}
return 0;
}