zoukankan      html  css  js  c++  java
  • 51nod 1086 背包问题V2 二进制优化多重背包

    有N种物品,每种物品的数量为C1,C2……Cn。从中任选若干件放在容量为W的背包里,每种物品的体积为W1,W2……Wn(Wi为整数),与之相对应的价值为P1,P2……Pn(Pi为整数)。求背包能够容纳的最大价值。
    Input
    第1行,2个整数,N和W中间用空格隔开。N为物品的种类,W为背包的容量。(1 <= N <= 100,1 <= W <= 50000)
    第2 - N + 1行,每行3个整数,Wi,Pi和Ci分别是物品体积、价值和数量。(1 <= Wi, Pi <= 10000, 1 <= Ci <= 200)
    Output
    输出可以容纳的最大价值。
    Input示例
    3 6
    2 2 5
    3 3 8
    1 4 1
    Output示例
    9


    emmmmmm……转化为01背包TLE了……然后看大佬题解,初学DP的窝才知道,原来还有二进制优化这种操纵……学习学习!

    转化为01背包的时候用二进制转化,然后剩余量补充一遍

    #include<iostream>
    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    int dp[50005];
    int n, m, t, v;
    int w[105];
    int c[105];
    int p[105];
    int main()
    {
        scanf("%d%d", &n, &v);
        memset(dp, 0, sizeof(dp));
        int crt = 1;
        for (int i = 0; i < n; i++)
            scanf("%d %d %d", &w[i], &p[i], &c[i]);
        for (int i = 0; i < n; i++)
        {
            int k = 1, a = c[i];
            while (k < a) {
                for (int j = v; j >= k*w[i]; j--)
                    dp[j] = max(dp[j], dp[j - k*w[i]] + k*p[i]);
                a -= k;
                k *= 2;
            }
            for (int j = v; j >= a*w[i]; j--)
                dp[j] = max(dp[j], dp[j - a*w[i]] + a*p[i]);
        }
            printf("%d
    ", dp[v]);
        return 0;
    }
  • 相关阅读:
    11111 Generalized Matrioshkas
    Uva 442 Matrix Chain Multiplication
    Uva 10815 Andy's First Dictionary
    Uva 537 Artificial Intelligence?
    Uva 340 MasterMind Hints
    SCAU 9508 诸葛给我牌(水泥题)
    Uva 10420 List of Conquests(排序水题)
    Uva 409 Excuses, Excuses!
    10/26
    11/2
  • 原文地址:https://www.cnblogs.com/Egoist-/p/7420368.html
Copyright © 2011-2022 走看看