您的位置:首页 > 其它

SSL_2293--暗黑游戏(动规练习题)

2017-12-12 17:50 274 查看

题目描述

暗黑游戏中,装备直接决定玩家人物的能力。可以使用Pg和Rune购买需要的物品。暗黑市场中的装备,每件有不同的价格(Pg和Rune)、能力值、最大可购买件数。Kid作为暗黑战网的一个玩家,当然希望使用尽可能少的Pg和Rune购买更优的装备,以获得最高的能力值。请你帮忙计算出现有支付能力下的最大可以获得的能力值。

输入格式

第一行,三个整数N,P,R,分别代表市场中物品种类,Pg的支付能力和Rune的支付能力。

  第2..N+1行,每行四个整数,前两个整数分别为购买此物品需要花费的Pg,Rune,第三个整数若为0,则说明此物品可以购买无数件,若为其他数字,则为此物品可购买的最多件数(S),第四个整数为该装备的能力值。

输出格式


仅一行,一个整数,最大可获得的能力值。


样例输入

3 10 10

5 3 0 110

4 3 4 120

2 3 1 130

样例输出 

370


思路

本题可以理解为二维费用+混合背包问题,可以将Pg的支付能力理解为重量,将Rune理解为体积就可以了。

代码(C++)

#include<cstdio>
#include<cstring>
#define sr c=getchar()
#define input read()
#define pd (c<'0'||c>'9')
#define fk f=f*10+c-48
#define ps if (c=='-') d=-1
using namespace std;
int f[101][101];int v,u,k;
int a[10001],c[10001],b[10001],s[10001];
int max(int x,int y)
{
return x>y?x:y;
}
int read()//输入快速流
{
char c;int d=1,f=0;
while (sr,pd) ps; fk;
while (sr,!pd) fk;
return d*f;
}
void write(int x)//输出快速流
{
if (!x) return;
write(x/10);
putchar(x%10+48);
}
int main()
{
f[0][0]=0;
k=input;v=input;u=input;
for (int i=1;i<=k;i++)
{
a[i]=input;//重量
b[i]=input;//体积
s[i]=input;//数量
c[i]=input;//价值
}
for (int i=1;i<=k;i++)
if (!s[i])//如果是0则是无穷背包
for (int j=0;j<=v;j++)
for (int l=0;l<=u;l++)
{
int t1=j+a[i],t2=l+b[i];
if (t1>v) continue;
if (t2>u) continue;
if (f[t1][t2]<f[j][l]+c[i]) f[t1][t2]=f[j][l]+c[i];
}
else
for (int o=1;o<=s[i];o++)//多重背包,也可以二进制优化,这里用的是朴素算法
for (int j=v;j>=0;j--)
for (int l=u;l>=0;l--)
{
int t1=j+a[i],t2=l+b[i];
if (t1>v) continue;
if (t2>u) continue;
if (f[t1][t2]<f[j][l]+c[i]) f[t1][t2]=f[j][l]+c[i];
}
write(f[v][u]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: