http://poj.org/problem?id=2392
Description
Input
Output
Sample Input
3 7 40 3 5 23 8 2 52 6
Sample Output
48
Hint
A | 812 | 188 | 858 |
/** poj2392 多重背包问题 题目大意:有n种石头,每种石头的高度为h,数量为c,可以存在的最高的高度为a,求怎样安排使得所有的石头在满足要求的前提下可以叠加到最高的高度 解题思路;将所有的石头按照高度上限来进行排序,再按多重背包来做。至于为什么排序,是因为如果限制高的先拍,后面限制低的石头就可能无法使用了。 */ #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; struct note { int h,a,c; }p[410]; bool cmp(note x,note y) { return x.a<y.a; } int n,dp[40010]; int main() { while(~scanf("%d",&n)) { for(int i=0;i<n;i++) { scanf("%d%d%d",&p[i].h,&p[i].a,&p[i].c); } dp[0]=1; sort(p,p+n,cmp); for(int i=0;i<n;i++) { for(int j=0;j<p[i].c;j++) { for(int k=p[i].a;k>=p[i].h;k--) { dp[k]|=dp[k-p[i].h]; } } } int cnt=0; for(int i=p[n-1].a;i>=0;i--) { if(dp[i]) { cnt=i; break; } } printf("%d\n",cnt); } return 0; }
2392 | Accepted | 452K | 79MS | C++ | 1255B | 2014-11-16 20:37:52 |
/** poj2392 多重背包问题 写法二,速度更快 */ #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; struct note { int h,a,c; } p[410]; bool cmp(note x,note y) { return x.a<y.a; } int n,dp[40010],times[40010]; int main() { while(~scanf("%d",&n)) { for(int i=0; i<n; i++) { scanf("%d%d%d",&p[i].h,&p[i].a,&p[i].c); } memset(dp,0,sizeof(dp)); dp[0]=1; sort(p,p+n,cmp); for(int i=0; i<n; i++) { memset(times,0,sizeof(times)); for(int k=p[i].h; k<=p[i].a; k++) { if(!dp[k]&&dp[k-p[i].h]&×[k-p[i].h]+1<=p[i].c) { times[k]=times[k-p[i].h]+1; dp[k]|=dp[k-p[i].h]; } } } int cnt=0; for(int i=p[n-1].a; i>=0; i--) { if(dp[i]) { cnt=i; break; } } printf("%d\n",cnt); } return 0; }
A | 812 | 188 | 858 |