反正看见这个题目就想多了,小组赛的时候很遗憾的没有A出来。
开始的时候想到先用分组背包的思想求出每组取一个的最大值。在用贪心的思路去做。越打越复杂,就一个伤心啊!!!
比完以后,看了下网上的结题报告,才打出来的。
注意一下存储的方法就行啦,其他就没有什么了。。。。
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node{
int pri,val;
}q[13][10003];
int dp[18][10003],w[18];
int main(){
int n,m,k,i,j,sum;
int a,b,c;
while(~scanf("%d%d%d",&n,&m,&k)){
memset(w,0,sizeof(w));
for(i=1;i<=n;i++){
scanf("%d%d%d",&a,&b,&c);
q[a][w[a]].pri=b;
q[a][w[a]].val=c;
w[a]++;
}
memset(dp,-1,sizeof(dp));
memset(dp[0],0,sizeof(dp[0]));
for(i=1;i<=k;i++){
for(int z=0;z<w[i];z++){
for(j=m;j>=q[i][z].pri;j--){
if(dp[i][j-q[i][z].pri] != -1) //一组多个
dp[i][j]=max(dp[i][j],dp[i][j-q[i][z].pri]+q[i][z].val);
if(dp[i-1][j-q[i][z].pri] != -1) //一组一个
dp[i][j]=max(dp[i][j],dp[i-1][j-q[i][z].pri]+q[i][z].val);
}
}
}
if(dp[k][m] == -1) printf("Impossible\n");
else printf("%d\n",dp[k][m]);
}
return 0;
}
路途中。。。。