HDU 5410 CRB and His Birthday

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5410

Problem Description

Today is CRB‘s birthday. His mom decided to buy many presents for her lovely son.
She went to the nearest shop with M Won(currency unit).
At the shop, there are N kinds of presents.
It costs Wi Won to buy one present of i-th kind. (So it costs k × Wi Won to buy k of them.)
But as the counter of the shop is her friend, the counter will give Ai × x + Bi candies if she buys x(x>0) presents of i-th kind.
She wants to receive maximum candies. Your task is to help her.
1 ≤ T ≤ 20
1 ≤ M ≤ 2000
1 ≤ N ≤ 1000
0 ≤ Ai, Bi ≤ 2000
1 ≤ Wi ≤ 2000

Input

There are multiple test cases. The first line of input contains an integer T, indicating the number of test cases. For each test case:
The first line contains two integers M and N.
Then N lines follow, i-th line contains three space separated integers Wi, Ai and Bi.

Output

For each test case, output the maximum candies she can gain.

Sample Input

1
100 2
10 2 1
20 1 1

Sample Output

21

Hint

CRB‘s mom buys 10 presents of first kind, and receives 2 × 10 + 1 = 21 candies.

题目的大概意思是有M元钱,有N件物品,没件物品的花费是W[i],第i件物品买X件能得到A[i]*X+B[i]块糖,没件物品买的数量没有上限

问这M元钱最多能得到多少块糖。

问题分析:没种物品买第一件能得到A[i]+B[i]块糖,以后每买一件只能多得到A[i]块糖,也就是每种物品买第一件比买后面的得到的糖多,

根据贪心的思想很容易想到要先每种物品买一件再买大于一件,这样就把问题分成了两个阶段,第一阶段每种物品最多只买一件,

0/1背包,第二阶段,没种物品能买无限件,完全背包。

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4
 5 int ma(int a,int b)
 6 {
 7     if (a>b)
 8     return a;
 9     else
10     return b;
11 }
12 int main()
13 {
14     int ans[12000],v,a[1100],b[1100],c[1100],n,m,T;
15     cin>>T;
16     while (T--)
17     {
18           cin>>v>>m;
19           for (int i=1;i<=m;i++)
20           cin>>c[i]>>a[i]>>b[i];
21           memset(ans,0,sizeof(ans));
22           for (int i=1;i<=m;i++)//处理第一阶段,0/1背包
23           {
24               for (int j=v;j>=c[i];j--)
25               {
26                   ans[j]=ma(ans[j],ans[j-c[i]]+a[i]+b[i]);
27               }
28           }
29           for (int i=1;i<=m;i++)//处理第二阶段,完全背包。
30           {
31               for (int j=c[i];j<=v;j++)
32               {
33                    ans[j]=ma(ans[j],ans[j-c[i]]+a[i]);
34               }
35           }
36           cout <<ans[v]<<endl;
37     }
38     return 0;
39 }   

时间: 2024-08-28 07:21:18

HDU 5410 CRB and His Birthday的相关文章

HDU 5410 CRB and His Birthday(DP)

CRB and His Birthday Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 83    Accepted Submission(s): 45 Problem Description Today is CRB's birthday. His mom decided to buy many presents for her l

hdu 5410 CRB and His Birthday(混合背包)

Problem Description Today is CRB's birthday. His mom decided to buy many presents for her lovely son. She went to the nearest shop with M Won(currency unit). At the shop, there are N kinds of presents. It costs Wi Won to buy one present of i-th kind.

hdu 5410 CRB and His Birthday(动态规划)

题目: CRB and His Birthday Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 748    Accepted Submission(s): 395 Problem Description Today is CRB's birthday. His mom decided to buy many presents for

hdu 5410 CRB and His Birthday 01背包和完全背包

#include<stdio.h> #include<string.h> #include<vector> #include<queue> #include<algorithm> using namespace std; int main() { int _,i,j,m,n,k,a[1024],b[1024],w[1024],dp[2048]; scanf("%d\n",&_); while(_--) { scanf(

HDU 5410 CRB and His Birthday ——(完全背包变形)

对于每个物品,如果购买,价值为A[i]*x+B[i]的背包问题. 先写了一发是WA的= =.代码如下: 1 #include <stdio.h> 2 #include <algorithm> 3 #include <string.h> 4 #include <set> 5 using namespace std; 6 typedef pair<int,int> pii; 7 8 pii dp[2005]; 9 int w[1005],A[1005

HDU 5410 CRB and His Birthday (01背包,完全背包,混合)

题意:有n种商品,每种商品中有a个糖果,如果买这种商品就送多b个糖果,只有第一次买的时候才送.现在有m元,最多能买多少糖果? 思路:第一次买一种商品时有送糖果,对这一次进行一次01背包,也就是只能买一次.然后对这种商品来一次完全背包,此时不送糖果,也可以多买. 1 #include <bits/stdc++.h> 2 #define pii pair<int,int> 3 #define INF 0x7f7f7f7f 4 #define LL long long 5 using n

HDU 5410 CRB and His Birthday (2015年多校比赛第10场)

1.题目描述:点击打开链接 2.解题思路:本题是完全背包问题的一种变形.根据题意描述,每种物品的价值随着A[i]是线性变化的,但是并不随着B[i]线性变化,B[i]仅仅是在第一次挑选第i件物品是才算入,其他时候均不算入.因此,这里的状态要比普通的完全背包增加一个维度:是否是第一次选第i件物品,即用(i,j,flag)表示当前背包容量为j时,是否为第一次选第i件物品时的最大价值.那么不难得到如下状态转移方程: dp(i+1,j,0)=max{dp(i,j,0),dp(i,j,1)}; dp(i+1

HDU 5410(2015多校10)-CRB and His Birthday(完全背包)

题目地址:HDU 5410 题意:有M元钱,N种礼物,若第i种礼物买x件的话,会有Ai*x+Bi颗糖果,现给出每种礼物的单价.Ai值与Bi值,问最多能拿到多少颗糖果. 思路:完全背包问题. dp[j][1]在当前物品时花钱为j的并且买过当前物品的最大值. dp[j][0]不买当前这件物品此前花钱为j的的最大值. 每种物品的价值随Ai线性变化,但是不随B[i]线性变化,B[i]仅是在第一次挑选第i件物品是才算入,其他时候均不算入.所以我们可以写出状态转移方程: dp[j][0]=max(dp[j]

hdu 5412 CRB and Queries(线段树套笛卡尔树 - 动态区间第k大)

题目链接:hdu 5412 CRB and Queries 首先对所有出现过的值排序,建立线段树,每个线段树的节点是一棵笛卡尔树,笛卡尔树记录区间下标值. #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> using namespace std; #define lson(x) (x<<1) #define rson(x) ((x<<