• 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
    ", dp[M]);
        }
    }
  • 相关阅读:
    RTP 控制协议
    非关系型数据库
    关系型数据库
    处理海量数据
    处理大并发
    C++ 模板偏特化-来自STL的思考
    C++详解new/delete
    二分算法来相会
    计算机网络知识点总结
    C++字符串类型转换
  • 原文地址:https://www.cnblogs.com/CheeseIce/p/9588682.html
Copyright © 2020-2023  润新知