CRB and His BirthdayTime Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u
Description
Today is CRB's birthday. His mom decided to buy many presents for her lovely son.
She went to the nearest shop with Won(currency unit).
At the shop, there are kinds of presents.
It costs Won to buy one present of -th kind. (So it costs × Won to buy of them.)
But as the counter of the shop is her friend, the counter will give candies if she buys ( >0) presents of -th kind.
She wants to receive maximum candies. Your task is to help her.
1 ≤ ≤ 20
1 ≤ ≤ 2000
1 ≤ ≤ 1000
0 ≤ ≤ 2000
1 ≤ ≤ 2000
She went to the nearest shop with Won(currency unit).
At the shop, there are kinds of presents.
It costs Won to buy one present of -th kind. (So it costs × Won to buy of them.)
But as the counter of the shop is her friend, the counter will give candies if she buys ( >0) presents of -th kind.
She wants to receive maximum candies. Your task is to help her.
1 ≤ ≤ 20
1 ≤ ≤ 2000
1 ≤ ≤ 1000
0 ≤ ≤ 2000
1 ≤ ≤ 2000
Input
There are multiple test cases. The first line of input contains an integer
, indicating the number of test cases. For each test case:
The first line contains two integers and .
Then lines follow, -th line contains three space separated integers , and .
The first line contains two integers and .
Then lines follow, -th line contains three space separated integers , and .
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.
解题:先跑一遍01背包,价值为a+b的,然后再按价值为a的完全背包跑。(换过来也一样)
<span style="font-size:18px;">#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int dp[2005];
int n,m,t;
int a[1005],b[1005],v[1005];
int main()
{
scanf("%d",&t);
while(t--){
scanf("%d %d",&m,&n);
for(int i=1;i<=n;i++)
scanf("%d %d %d",&v[i],&a[i],&b[i]);
memset(dp,0,sizeof(dp));
int ans=0;
for(int i=1;i<=n;i++){
for(int j=v[i];j<=m;j++){
dp[j]=max(dp[j],dp[j-v[i]]+a[i]);
ans=max(ans,dp[j]);
}
for(int j=m;j>=v[i];j--){
dp[j]=max(dp[j],(dp[j-v[i]]+a[i]+b[i]));
ans=max(ans,dp[j]);
}
}
printf("%d\n",ans);
}
return 0;
}</span>