P3793礼物和糖果
2017-09-19 19:14
134 查看
问题描述
何老板要给大家买节日礼物,他有M元钱,学校小卖部有N种礼品,因为店长和何老板是熟人,所以若第i种礼品买x(x>0)件的话,店长会给何老板Ai*x+Bi颗糖果。
因为何老板非常喜欢吃糖,所以他希望获得的糖果越多越好。现给出每种礼品的单价Wi、Ai值与Bi值,问何老板最多能得到多少颗糖果?
输入格式
第一行,两个空格间隔的整数M和N
接下来N行,每行三个整数Wi, Ai 和 Bi,描述一种礼物的情况。
输出格式
一行,一个整数,表示何老板能得到的最大糖果数
样例输入
100 2
10 2 1
20 1 1
样例输出
21
提示
样例说明,何老板买了10个1号礼物,获得 2 × 10 + 1 = 21颗糖
1 ≤ M ≤ 2000
1 ≤ N ≤ 1000
0 ≤ Ai, Bi ≤ 2000
1 ≤ Wi ≤ 2000
三维肯定会超时
考虑将ax+b分为两种商品
一种为 价值为a+b且数量只有一种
第二种为 价值为a但是数量无限
何老板要给大家买节日礼物,他有M元钱,学校小卖部有N种礼品,因为店长和何老板是熟人,所以若第i种礼品买x(x>0)件的话,店长会给何老板Ai*x+Bi颗糖果。
因为何老板非常喜欢吃糖,所以他希望获得的糖果越多越好。现给出每种礼品的单价Wi、Ai值与Bi值,问何老板最多能得到多少颗糖果?
输入格式
第一行,两个空格间隔的整数M和N
接下来N行,每行三个整数Wi, Ai 和 Bi,描述一种礼物的情况。
输出格式
一行,一个整数,表示何老板能得到的最大糖果数
样例输入
100 2
10 2 1
20 1 1
样例输出
21
提示
样例说明,何老板买了10个1号礼物,获得 2 × 10 + 1 = 21颗糖
1 ≤ M ≤ 2000
1 ≤ N ≤ 1000
0 ≤ Ai, Bi ≤ 2000
1 ≤ Wi ≤ 2000
题解
背包问题。三维肯定会超时
考虑将ax+b分为两种商品
一种为 价值为a+b且数量只有一种
第二种为 价值为a但是数量无限
代码
#include<stdio.h> #include<algorithm> #include<iostream> #include<cmath> #include<cstring> #include<queue> #include<cstdio> using namespace std; int w[1005][2002]; int m,n; int f[2005]; int ans; int c[1005],a[1005],b[1005]; int main() { int i,j; f[0]=1; scanf("%d%d",&m,&n); for(i=1;i<=n;i++){ scanf("%d%d%d",&c[i],&a[i],&b[i]); for(j=m;j>=c[i];j--) if(f[j-c[i]]) { f[j]=max(f[j],f[j-c[i]]+b[i]+a[i]);ans=max(ans,f[j]);} for(j=c[i];j<=m-c[i];j++) if(f[j]) { f[j+c[i]]=max(f[j+c[i]],f[j]+a[i]);ans=max(ans,f[j+c[i]]); } } cout<<ans-1; }
相关文章推荐
- NKOJ 3793 礼物和糖果(背包dp)
- nkoi P3793 礼物和糖果
- 鼓励园哥 与 送“礼物”:开心
- 九度 1550 分糖果
- 中国手游如何复制“糖果”传奇?
- HDU 1870 愚人节的礼物
- 栈的简易应用,愚人节的礼物
- 完美的礼物为极限运动范
- hdu 1290 献给杭电五十周年校庆的礼物
- 给美国人送什么礼物比较好?
- POJ-2942:吃糖果
- 1045: [HAOI2008] 糖果传递 (中位数)
- HDU 1870 愚人节的礼物 消除左右括号
- HDU 1870 愚人节的礼物(栈的简单应用)
- P1567 吃糖果游戏
- Problem D: hardbird 的礼物 信息杯班级对抗赛
- 分糖果
- 【BZOJ 3052】 [wc2013]糖果公园
- BZOJ 2330 糖果