Description
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
, 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
. Output
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>
3357



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



