• 多重背包模板 51Nod 1086


    有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

    注意中间每种商品个数的二进制优化
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <queue>
    #include <cmath>
    #include <vector>
    #include <algorithm>
    using namespace std;
    #define lowbit(x) (x&(-x))
    #define max(x,y) (x>y?x:y)
    #define min(x,y) (x<y?x:y)
    #define MAX 100000000000000000
    #define MOD 1000000007
    #define PI 3.141592653589793238462
    #define INF 1000000000
    #define mem(a) (memset(a,0,sizeof(a)))
    int dp[500005];
    int main()
    {
        int n,m,w,c,p;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            for(int i=1;i<=n;i++)
            {
                scanf("%d%d%d",&w,&p,&c);
                for(int k=1,flag=1; ;k*=2)
                {
                    if(k*2>=c)
                    {
                        k=c-k+1;
                        flag=0;
                    }
                    for(int j=m;j>=k*w;j--)
                    {
                        dp[j]=max(dp[j],dp[j-k*w]+k*p);
                    }
                    if(flag==0) break;
                }
                
            }
            printf("%d
    ",dp[m]);
        }
        return 0;
    }
  • 相关阅读:
    NET开发中的事务处理大比拼
    gridview 导出Excel
    项目 心得
    设计模式Prototype原型模式
    设计模式Memento 备忘录模式
    设计模式Chain Of Responsibility 职责链模式
    设计模式Composite组合模式
    .NET常用功能和代码[总结与收藏]
    SQL SERVER函数——表值函数的处理
    设计模式学习笔记 简单工厂模式
  • 原文地址:https://www.cnblogs.com/shinianhuanniyijuhaojiubujian/p/7192932.html
Copyright © 2020-2023  润新知