POJ-2754 Similarity of necklaces 2 多重背包
2013-03-13 22:10
288 查看
题目链接:http://poj.org/problem?id=2754
当时居然没有想到是多重背包,敲了个分组背包,TLE。。。
后来才知道可以转化为多重背包,即把每个下界L[i]放为0,上限为U[i]-L[i],就是物品的个数,价值为P[i],花费为M[i]。本来题目要求Σ(M[i]*Table[i])=0时,Σ(P[i]*Table[i])的最大值。现在Table[i]的每个值都加了-L[i],即Σ(M[i]*Table[i] + M[i]*L[i]) 时,Σ(P[i]*Table[i] + P[i]*L[i])的最值,由Σ(M[i]*Table[i])=0可知,背包的容量为Σ(M[i]*L[i]),典型的多重背包问题了。最后再把累加的值减去就行了。
当时居然没有想到是多重背包,敲了个分组背包,TLE。。。
后来才知道可以转化为多重背包,即把每个下界L[i]放为0,上限为U[i]-L[i],就是物品的个数,价值为P[i],花费为M[i]。本来题目要求Σ(M[i]*Table[i])=0时,Σ(P[i]*Table[i])的最大值。现在Table[i]的每个值都加了-L[i],即Σ(M[i]*Table[i] + M[i]*L[i]) 时,Σ(P[i]*Table[i] + P[i]*L[i])的最值,由Σ(M[i]*Table[i])=0可知,背包的容量为Σ(M[i]*L[i]),典型的多重背包问题了。最后再把累加的值减去就行了。
//STATUS:C++_AC_375MS_580KB #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include<iostream> #include<string> #include<algorithm> #include<vector> #include<queue> #include<stack> using namespace std; #define LL __int64 #define pii pair<int,int> #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) #define mem(a,b) memset(a,b,sizeof(a)) #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 const int N=210,INF=0x3f3f3f3f,MOD=100000000; const double DNF=100000000000; int f[N*25*20],pa ,m ,l ,up ; int n,rp,rm; void zo(int v,int w) { int j; for(j=rm;j>=v;j--){ if(f[j-v]>=0) f[j]=Max(f[j],f[j-v]+w); } } int main() { // freopen("in.txt","r",stdin); int i,j,k; while(~scanf("%d",&n)) { mem(f,-1); for(i=rm=rp=0;i<n;i++){ scanf("%d%d%d%d",&pa[i],&m[i],&l[i],&up[i]); rp+=l[i]*pa[i]; rm-=l[i]*m[i]; up[i]-=l[i]; } f[0]=0; for(i=0;i<n;i++){ for(k=1;up[i]>k;up[i]-=k,k<<=1){ zo(k*m[i],k*pa[i]); } if(up[i])zo(up[i]*m[i],up[i]*pa[i]); } printf("%d\n",f[rm]+rp); } return 0; }
相关文章推荐
- poj 2754 Similarity of necklaces 2 转换成多重背包,单调队列优化/ 二进制优化
- poj 2754 Similarity of necklaces 2
- POJ 2754 Similarity of necklaces 2
- POJ-2754 Similarity of necklaces 2 区间取下界操作+DP
- POJ 3132 Sum of Different Primes 动态规划 DP 0-1背包问题
- poj 2754/1014 多重背包之二进制优化
- POJ 2576 Tug of War 二维背包 OR 随机化
- POJ 2576 Tug of War二维背包恰好装满.
- POJ 3093 Margaritas(Kind of wine) on the River Walk (背包方案统计)
- 【01背包方案数】POJ-3132 Sum of Different Primes
- POJ 2576 Tug of War 二维费用背包
- POJ 3132 Sum of Different Primes ( 满背包问题)
- POJ 3132 Sum of Different Primes 动态规划 DP 0-1背包问题
- 【POJ】【2699】The Maximum Number of Strong Kings
- poj 1236 Network of Schools 强连通
- POJ 1236 NETWORK OF SCHOOL
- poj 1060 Modular multiplication of polynomials 二进制多项式取余式运算。
- POJ 3498 March of the Penguins
- POJ3260——The Fewest Coins(多重背包+完全背包)
- POJ 1920 :Towers of Hanoi