暗黑游戏(正解)
这是一道使用多重背包的题
其实还是挺简单的
哈哈哈哈哈哈哈
描述
暗黑游戏中,装备直接决定玩家人物的能力。可以使用 Pg 和 Rune 购买需要的物品。暗黑市场中的装备,每件有不同的价格(Pg 和 Rune)、能力值、最大可购买件数。Kid 作为暗黑战网的一个玩家,当然希望使用尽可能少的 Pg 和 Rune 购买更优的装备,以获得最高的能力值。请你帮忙计算出现有支付能力下的最大可以获得的能力值。
输入
第一行,三个整数 N,P,R,分别代表市场中物品种类,Pg 的支付能力和 Rune 的支付能力。
第 2 ~ N+1 行,每行四个整数,前两个整数分别为购买此物品需要花费的 Pg,Rune,第三个整数若为 0,则说明此物品可以购买无数件,若为其他数字,则为此物品可购买的最多件数(S),第四个整数为该装备的能力值。
输出
仅一行,一个整数,最大可获得的能力值。
输入样例 1
3 10 10 5 3 0 110 4 3 4 120 2 3 1 130
输出样例 1
370
提示
样例解释
选第二种装备 2 件和第三种装备 1 件。
数据规模
对于 30%的数据, 0<N<=50, 0<P<=30, 0<R<=30, 0<=S<=8; 对于 70%的数据, 0<N<=80, 0<P<=65, 0<R<=65, 0<=S<=16; 对于 100%的数据, 0<N<=150, 0<P<=100, 0<R<=100, 0<=S<=32;
来源
一本通
下面是多重背包的基本打法
while(x <= c[i]) { k++; A[k] = a[i]*x; B[k] = b[i]*x; c[i] -= x; x *= 2; } if(c[i]>0) { k++; A[k] = a[i]*c[i]; B[k] = b[i]*c[i]; } }
//转成01背包来写,注意:此处打包总个数位k,不要写成n
for(int i = 1; i <= k; i++)
{
for(int j = m; j >= A[i]; j--)
{
dp[j] = max(dp[j], dp[j-A[i]] + B[i]);
}
}
只要掌握了多重背包的基本思路就能快速做出此题
下面是这道题的正解代码
#include<bits/stdc++.h> using namespace std; long long n,k,V1,V2,w1[1000009],w2[10000009],v[10000009],p[10000009],vp[10000009],wp1[10000009],wp2[10000009],f[1009][1009]; int main() { cin>>n>>V1>>V2; for(long long i=1;i<=n;i++) { cin>>w1[i]>>w2[i]>>p[i]>>v[i]; int x=1; if(p[i]==0) { p[i]=min(V1/w1[i],V2/w2[i]); } while(x<=p[i]) { k++; wp1[k]=w1[i]*x; wp2[k]=w2[i]*x; vp[k]=v[i]*x; p[i]-=x; x*=2; } if(p[i]>0) { k++; wp1[k]=w1[i]*p[i]; wp2[k]=w2[i]*p[i]; vp[k]=v[i]*p[i]; } } for(long long i=1;i<=k;++i) { for(long long j=V1;j>=wp1[i];j--) { for(long long k=V2;k>=wp2[i];k--) { f[j][k]=max(f[j][k],f[j-wp1[i]][k-wp2[i]]+vp[i]); } } } cout<<f[V1][V2]; return 0; }
这是背包问题中比较好的一道题,需要大家靠自己去做一做,看懂后自己去打代码,不要粘贴!
再插一句欧文万岁!!!


浙公网安备 33010602011771号