先跑一遍01背包,再跑一遍多重背包
CRB and His Birthday
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 327 Accepted Submission(s): 177
Problem Description
Today is CRB's birthday. His mom decided to buy many presents for her lovely son.
She went to the nearest shop withM Won(currency
unit).
At the shop, there areN kinds
of presents.
It costsWi 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 giveAi × 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
She went to the nearest shop with
At the shop, there are
It costs
But as the counter of the shop is her friend, the counter will give
She wants to receive maximum candies. Your task is to help her.
1 ≤
1 ≤
1 ≤
0 ≤
1 ≤
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 integersM and N .
ThenN lines
follow, i -th
line contains three space separated integers Wi , Ai and Bi .
The first line contains two integers
Then
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
21HintCRB's mom buys 10 presents of first kind, and receives 2 × 10 + 1 = 21 candies.
Author
KUT(DPRK)
Source
/* *********************************************** Author :CKboss Created Time :2015年08月21日 星期五 13时29分32秒 File Name :HDOJ5410.cpp ************************************************ */ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <cmath> #include <cstdlib> #include <vector> #include <queue> #include <set> #include <map> using namespace std; const int maxn=1100; int m,n; int w[maxn],A[maxn],B[maxn]; int dp[maxn*2]; int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int T_T; scanf("%d",&T_T); while(T_T--) { scanf("%d%d",&m,&n); for(int i=1;i<=n;i++) scanf("%d%d%d",w+i,A+i,B+i); memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) { for(int j=m;j>=w[i];j--) { dp[j]=max(dp[j],dp[j-w[i]]+A[i]+B[i]); } } for(int i=1;i<=n;i++) { for(int j=w[i];j<=m;j++) { dp[j]=max(dp[j],dp[j-w[i]]+A[i]); } } printf("%d ",dp[m]); } return 0; }