零崎的朋友很多Ⅰ
时间限制: 2000 ms 内存限制: 65536 kb
总通过人数: 233 总提交人数: 247
题目描述
零崎有很多朋友,其中有一个叫做lfj的接盘侠。
lfj是一个手残,他和零崎一起玩网游的时候不好好打本,天天看拍卖行,没过多久,就成为了一个出色的商人。时间一长,虽然挣了不少钱,却没时间练级了。
作为lfj的友人,零崎实在看不下去,于是他决定帮lfj一把。当然了,零崎肯定不会自己动手,活还得你们来干。
lfj可以提供给你们拍卖行所有能买到物品的价格和利润,由于游戏产出不限,所以可以假定只要有钱,即使是同一种东西,多少个也都能买到手。lfj还会告诉你他初始的成本。虽然零崎想让你们给出一次交易中利润最大的购买方案,但是lfj觉得只要知道最大利润就可以了。
输入
每组数据第一行为两个整数P和N,表示本金和拍卖行物品种类数。
接下来N行,每行两个数据pi,ci代表第i类物品的利润和购买价格。
1<=P<=20000,1<=N<=300,1<=c,p<=200
输出
对于每组数据,输出一行,为能获得的最大利润
输入样例
3 1
2 1
2 3
1 1
1 2
2 1
输出样例
6
4
解析:
完全背包问题。
状态转移方程:
for(LL i = w;i <= p;i++)
{
LL tmp = ans[i-w] + v;
if(ans[i] < tmp) ans[i] = tmp;
}
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 307
#define LL long long
using namespace std;
LL Weight[maxn],Value[maxn],ans[20007];
int p;
void cp_pack(LL w,LL v)
{
for(LL i = w;i <= p;i++)
{
LL tmp = ans[i-w] + v;
if(ans[i] < tmp) ans[i] = tmp;
}
}
int main()
{
int n;
while(~scanf("%d%d",&p,&n))
{
memset(ans,0,sizeof(ans));
for(int i = 1;i <= n;i++)
{
scanf("%lld%lld",&Value[i],&Weight[i]);
}
for(int i = 1;i <= n;i++)
{
cp_pack(Weight[i],Value[i]);
}
printf("%lld\n",ans[p]);
}
}
本文介绍了一道关于背包问题的编程题,主人公lfj需要利用初始资金,在多种物品中选择购买以获得最大利润。文章提供了问题描述、输入输出样例及解析,并附带了完整的C++代码实现。
1万+

被折叠的 条评论
为什么被折叠?



