暗黑游戏(正解)

这是一道使用多重背包的题

其实还是挺简单的

哈哈哈哈哈哈哈

 

描述

 

暗黑游戏中,装备直接决定玩家人物的能力。可以使用 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;
}

这是背包问题中比较好的一道题,需要大家靠自己去做一做,看懂后自己去打代码,不要粘贴!

再插一句欧文万岁!!!

 

 

posted @ 2020-08-19 20:38  .T  阅读(409)  评论(0)    收藏  举报