题目:http://acm.hdu.edu.cn/showproblem.php?pid=5410
虽然是英文题目:但还是很好理解的。明显的背包问题
思路:如果你能想到把题目拆分成小问题,就会简单许多:
既然题目中的价值是:这种形式Ai × x + Bi,可以看成两部分Ai + Bi和Ai × (x-1 )的和,对前面的Ai + Bi,就是01背包问题,只有两种可能选和不选。后面的Ai × (x-1 )就是完全背包问题,每个物品可以多次被选择。
使用的先后顺序?
都可以
因为不管什么顺序,都有存储两个值以供选择。实在不能理解,可以举个例子
1
2 1
1 1 2
先完全后01
经过第一个for循环后
dp[1]=1;
dp[2]=2;
经过第二个for循环后
dp2]=1+1+2=4;
反之:
经过第一个for循环后
dp[2]=3;
dp[1]=3
经过第二个for循环后
dp[1]=4;
dp[2]=4;
#include<stdio.h>
#include<string.h>
#define max(a,b) a>b?a:b
long long dp[5000000];
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int M, N;
int w, a, b;
scanf("%d%d", &M, &N);
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= N; i++)
{
scanf("%d%d%d", &w, &a, &b);
for(int j = w; j <= M; j++)
dp[j] = max(dp[j], dp[j-w]+a);
for(int j = M; j >= w; j--)
dp[j] = max(dp[j], dp[j-w]+a+b);
}
printf("%I64d
", dp[M]);
}
}