POJ 2392 初涉多重揹包
阿新 • • 發佈:2019-01-28
題意:有K種石頭,每種石頭的高度為H,個數為Q,放置高度不能超過C。問這些石頭最高的可達高度是多少。
裸的多重揹包。
對於N種,K件的多重揹包可以轉換成∑ki的01揹包。
假設不存在限制C時,則先放A種還是先放B中對結果無影響。當新增上限制條件C時,應該讓C小的在下面。故在進行01揹包前要將C排序。
#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <queue> #include <cmath> #include <algorithm> #include <stack> #define LL long long #define ULL unsigned long long #define PI (acos(-1.0)) #define EPS (1e-10) #pragma comment(linker,"/STACK:102400000,1024000") using namespace std; struct N { int w,v,q; }c[410]; bool acc[40010]; bool cmp(N c1, N c2) { return c1.w < c2.w; } int main() { int n,i,j,k; scanf("%d",&n); for(i = 0;i < n; ++i) { scanf("%d %d %d",&c[i].v,&c[i].w,&c[i].q); } sort(c,c+n,cmp); memset(acc,false,sizeof(acc)); acc[0] = true; int Max = 0; for(i = 0;i < n;++i) { for(j = 0;j < c[i].q; ++j) { for(k = c[i].w; k >= c[i].v; --k) { if(acc[k-c[i].v]) { acc[k] = true; Max = max(Max,k); } } } } printf("%d\n",Max); return 0; }