http://acm.hdu.edu.cn/status.php?user=515982859&pid=3033&status=5
题意: 有n个产品 m金额 k种品牌
每个产品 属于 a 品牌 b的价格 且具有c的价值量
问 在每种品牌至少买一个产品的情况下 最大价值量是多少
思路:
if(dp[i-1][h-p[i][j].w]>=0) //前i个品牌 加上当年品牌 前j个 的最大价值量 { dp[i][h]=max(dp[i][h],dp[i-1][h-p[i][j].w]+p[i][j].v); dp[i-1][h]=max(dp[i-1][h],dp[i-1][h-p[i][j].w]+p[i][j].v); }
#include<cstdio> #include<cstring> #include<vector> #include<iostream> #include<algorithm> using namespace std; struct Pro { int w,v; }; int dp[20][10000+100]; int main() { //freopen("output.txt","w",stdout); int n,m,k; int i,j,h; int b,w,v; while(scanf("%d%d%d",&n,&m,&k)!=EOF) { vector<Pro> p[20]; for(i=1;i<=n;i++) { scanf("%d%d%d",&b,&w,&v); Pro temp; temp.w=w; temp.v=v; p[b].push_back(temp); } memset(dp,-1,sizeof(dp)); dp[0][0]=0; for(i=1;i<=k;i++) { for(j=0;j<p[i].size();j++) { for(h=m;h>=p[i][j].w;h--) { if(dp[i-1][h-p[i][j].w]>=0) { dp[i][h]=max(dp[i][h],dp[i-1][h-p[i][j].w]+p[i][j].v); dp[i-1][h]=max(dp[i-1][h],dp[i-1][h-p[i][j].w]+p[i][j].v); } } } } int ans=-1; for(i=0;i<=m;i++) { if(dp[k][i]>ans) ans=dp[k][i]; } if(ans>-1) printf("%d ",ans); else printf("Impossible "); } return 0; }