题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3033
这个题目其实背包很容易看出来,关键是每组至少取一个不怎么好处理
代码中这句就是保证了这个限制,如果是-1的话,说明前面肯定有某个
分组里面一个没取,我们向下来的就要找前面每个分组都取了的最优值
if(dp[i][r-v[i][j]]!=-1)
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <iostream>
#include <vector>
using namespace std;
int n,k,m;
#define MAX(a,b) (a>b?a:b)
int dp[12][110000];
vector<int> v[12],c[12];
int main(){
int i,j,r,a,b;
while(scanf("%d%d%d",&n,&m,&k)!=EOF){
for(i=0;i<12;i++) v[i].clear(),c[i].clear();
for(i=0;i<n;i++){
scanf("%d%d%d",&a,&b,&r);
v[a].push_back(b);
c[a].push_back(r);
}
memset(dp,-1,sizeof(dp));
for(i=0;i<=m;i++) dp[0][i]=0;
for(i=1;i<=k;i++){
for(j=0;j<v[i].size();j++)
for(r=m;r>=v[i][j];r--){
if(dp[i][r-v[i][j]]!=-1) dp[i][r]=MAX(dp[i][r],dp[i][r-v[i][j]]+c[i][j]);
if(dp[i-1][r-v[i][j]]!=-1) dp[i][r]=MAX(dp[i][r],dp[i-1][r-v[i][j]]+c[i][j]);
}
}
if(dp[k][m] < 0) printf("Impossible\n");
else
printf("%d\n",dp[k][m]);
}
return 0;
}