HDU 3033 I love sneakers!
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3033
经典,分组背包,第一次做这类题,其实就是多加一重循环用于分组DP。
#include <iostream> using namespace std; int dp[15][10100]; int brand[110],cost[110],val[110]; int main(int argc, const char *argv[]) { int N,M,K; //freopen("input.txt","r",stdin); while(cin>>N>>M>>K) { for(int i=1;i<=N;i++) { cin>>brand[i]>>cost[i]>>val[i]; } memset(dp,-1,sizeof(dp)); for(int j=0;j<=M;j++) dp[0][j]=0; for(int i=1;i<=K;i++) { for(int j=1;j<=N;j++) { if(brand[j]==i) { for(int k=M;k>=cost[j];k--) { dp[i][k]=max(max(dp[i][k],dp[i-1][k-cost[j]]+val[j]),dp[i][k-cost[j]]+val[j]); } } } } if(dp[K][M]<0) cout<<"Impossible"<<endl; else cout<<dp[K][M]<<endl; } return 0; }