5410 ACM 杭电 01+完全背包

题目: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\n", dp[M]);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42100472/article/details/81708228