HDU-3033 I love sneakers! (分组背包)
Posted tianwell
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU-3033 I love sneakers! (分组背包)相关的知识,希望对你有一定的参考价值。
题意:n种鞋子,m总金额,k品牌数 (1<=N<=100 1 <= M<= 10000 1<=K<=10) 然后对应n个鞋子给出对应的 编号a 金额b 价值c( 1<=a<=k, b and c, 0<=b,c<100000)
思路:事实上对于其他背包的限制,这里在于每种品牌只能取一个 那么我们可以循环每个种类,然后每次选择种类中的一个 然后再换到下一种 又取一个...
所以就将以前的v[j] 增加为v[i][j] 用i来表示种类 ,循环i ; 当然我们也可用vector数组来记录,这样直接用 s.size()就可以得到该种类的长度 而不必要再去统计。
题解:
#include <cstdio> #include <algorithm> #include <cstring> #include <cmath> using namespace std; int N,M,K; int p[15][105],v[15][105]; int dp[15][10005]; const int INF = 1e5; int main() while(scanf("%d%d%d",&N,&M,&K)!=EOF) memset(p,0,sizeof(p)); memset(v,0,sizeof(v)); for(int i=1;i<=N;i++) int x,y,z; scanf("%d%d%d",&x,&y,&z); ++p[x][0];//就利用自身第0个位置来记录种类个数 ++v[x][0]; p[x][p[x][0]] = y; v[x][v[x][0]] = z; //不要用memset()要保留dp[0][] = 0 for(int i=1;i<=10;i++) for(int j=0;j<10005;j++) dp[i][j] = -INF; for(int i=1;i<=K;i++) for(int k=1;k<=p[i][0];k++) for(int j=M;j>=p[i][k];j--) dp[i][j] = max(dp[i][j],max(dp[i-1][j-p[i][k]]+v[i][k],dp[i][j-p[i][k]]+v[i][k])); if(dp[K][M]<0) puts("Impossible"); else printf("%d\n",dp[K][M]); return 0;
以上是关于HDU-3033 I love sneakers! (分组背包)的主要内容,如果未能解决你的问题,请参考以下文章