• 背包九讲之四(混合三种背包问题)


     1 /*
     2 将01背包,完全背包,和多重完全背包问题结合起来,那么就是混合三种背的问题
     3 根据三种背包的思想,那么可以得到
     4 混合三种背包的问题可以这样子求解
     5 for(int i=1; i<=N; ++i)
     6 if(第i件物品是01背包)
     7     zeroOnePack(c[i],w[i]);
     8 else if(第i件物品是完全背包)
     9     completePack(c[i],w[i]);
    10 else if(第i件物品是多重完全背包)
    11     multiplePack(c[i],w[i],n[i]);
    12 
    13 这样能得到最优解的原因是,因为前一层已经是得到最优解了,
    14 当前层求解最优解的时候,我们考虑要使用三种背包中的哪一种方法
    15 而不用考虑前一层是怎么得到最优解的
    16 */
    17 
    18 #include <stdio.h>
    19 #include <string.h>
    20 int cash;
    21 int n[11],dk[11];
    22 int dp[1000000];
    23 inline int max(const int &a, const int &b)
    24 {
    25     return a < b ? b : a;
    26 }
    27 void CompletePack(int cost)
    28 {
    29     for(int i=cost; i<=cash; ++i)
    30         dp[i] = max(dp[i],dp[i-cost]+cost);
    31 }
    32 void ZeroOnePack(int cost)
    33 {
    34     for(int i=cash; i>=cost; --i)
    35         dp[i] = max(dp[i],dp[i-cost]+cost);
    36 }
    37 void MultiplePack(int cnt, int cost)
    38 {
    39     if(cnt*cost >=cash)//如果第i种物品的费用总和超过背包容量,那么就是完全背包问题
    40         CompletePack(cost);
    41     else
    42     {
    43         int k = 1;//二进制拆分
    44         while(k<cnt)//判断剩下的数字能不能够拆分为k
    45         {
    46             ZeroOnePack(cost*k);
    47             cnt -=k;
    48             k<<=1;
    49         }
    50         ZeroOnePack(cnt*cost);
    51     }
    52 }
    53 int main()
    54 {
    55     //输入的处理以及函数的调用
    56     return 0;
    57 }
  • 相关阅读:
    basic-linux
    巧用border属性
    git常用操作笔记
    如何删除github里的项目
    常用css3属性的ie兼容查看
    新建pc端页面的模板
    HTML5 Shiv--解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
    进程和线程
    C++对象模型---第 4 章 Function语意学
    C++对象模型---第 3 章 Data语意学
  • 原文地址:https://www.cnblogs.com/justPassBy/p/4279238.html
Copyright © 2020-2023  润新知