zoukankan      html  css  js  c++  java
  • 51nod 1086背包问题V2 (完全背包模板题)

    1086 背包问题 V2

    题目描述

    有N种物品,每种物品的数量为C1,C2......Cn。从中任选若干件放在容量为W的背包里,每种物品的体积为W1,W2......Wn(Wi为整数),与之相对应的价值为P1,P2......Pn(Pi为整数)。求背包能够容纳的最大价值。

     

    输入

    第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)

    输出

    输出可以容纳的最大价值。

    输入样例

    3 6
    2 2 5
    3 3 8
    1 4 1

    输出样例

    9


    题解:
      多重背包模板题。二进制优化。

    #include <stdio.h>
    #include <string.h>
    #include <string>
    #include <map>
    #include <queue>
    #include <iostream>
    #include <algorithm>
    #define ll long long
    #define ull unsigned ll
    #define exp 1e-8
    using namespace std;
    const int INF = 2e9 + 5;
    const int mod = 1e9 + 7;
    int c[50010],w[50010],num[50010],f[50010]={0};
    int main() {
        int V,N,wi,ci,numi,cnt = 0 ;
        scanf("%d%d",&N,&V);
        int cnt = 0;
        for (int i = 0; i < N; i++){
            scanf("%d%d%d",&wi,&ci,&numi);
            for (int j = 1; j <= numi; j<<=1){
                w[cnt] = j*wi;
                c[cnt] = j*ci;
                numi-=j;
                cnt++;
            }
            if (numi){
                w[cnt] = numi*wi;
                c[cnt] = numi*ci;
                cnt++;
            }
        }
        for (int i = 0; i < cnt; i++){
            for (int j = V; j >= w[i]; j--){
                f[j] = max(f[j],f[j-w[i]]+c[i]);
            }
        }
        printf("%d
    ",f[V]);
        return 0;
    }
    View Code




  • 相关阅读:
    10本Java程序员有助成长的书
    Java最新学习路线图
    2020最新版Java学习路线图
    自己的Java学习经历
    Java并发编程学习教程
    2020年最新Java学习路线
    Java Stream入门知识讲解
    你可能不知道的java14新特性
    Windows下获取当前目录路径,及创建新的文件夹方法
    win10下_findnext报oxc0000005错误解决
  • 原文地址:https://www.cnblogs.com/l999q/p/10684024.html
Copyright © 2011-2022 走看看