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

    1086 背包问题 V2 

    基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题

     收藏

     关注

    有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<bits/stdc++.h>
    #include<stdio.h>
    #include<iostream>
    #include<cmath>
    #include<math.h>
    #include<queue>
    #include<set>
    #include<map>
    #include<iomanip>
    #include<algorithm>
    #include<stack>
    #define inf 0x3f3f3f3f
    using namespace std;
    typedef long long ll;
    int n,W;
    int w[105];//体积
    int v[105];//价值
    int cnt[105];//数量
    int dp[50005];
    void solve()
    {
        for(int i=1;i<=n;i++)
        {
            int num=cnt[i];
            for(int k=1;num>0;k<<=1)
            {
                int tmp=min(k,num);
                for(int j=W;j>=w[i]*tmp;j--)
                {
                    dp[j]=max(dp[j],dp[j-w[i]*tmp]+v[i]*tmp);
                }
                num-=tmp;
            }
        }
    }
    int main()
    {
    #ifndef ONLINE_JUDGE
        freopen("in.txt","r",stdin);
    #endif // ONLIN
        scanf("%d%d",&n,&W);
        for(int i=1;i<=n;i++)scanf("%d%d%d",&w[i],&v[i],&cnt[i]);
        solve();
        printf("%d
    ",dp[W]);
        return 0;
    }
    
  • 相关阅读:
    TCP建立连接和断开连接
    城市三级联动Springmvc+mysql
    JS页面间数据传递的各种方法
    点击Button弹出登陆注册框
    一个多表联合查询引发的思考
    Linq扩展方法获取单个元素
    Visual Studio 常见问题
    格式化asp.net mvc视图页面
    2014上半年度挑战回顾
    2014年上半度年度挑战
  • 原文地址:https://www.cnblogs.com/linruier/p/9588292.html
Copyright © 2011-2022 走看看