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

 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 #include <stdio.h>
18 #include <string.h>
19
20 /*
21 有n件物品和一个容量为v的背包,第i种物品最多有n[i]件可用,
22 每件费用是c[i],价值是w[i],求解将哪些物品放入背包
23 使费用总和不超过背包容量且价值总和最大
24
25 for(i=1; i<=n; ++i)
26 for(j=0; j<=v; ++j)
27 for(k=0; k*c[i]<=j; ++k)
28     dp[i][j] = max(dp[i][j],dp[i-1][j-k*c[i]]+k*w[i]);
29 时间复杂度为O(V*∑n[i]);
30 另一种思想是二进制优化,时间复杂度为O(V*∑log(n[i]));
31 详见图片
32 */
33 #include <stdio.h>
34 #include <string.h>
35 int cash;
36 int n[11],dk[11];
37 int dp[1000000];
38 inline int max(const int &a, const int &b)
39 {
40     return a < b ? b : a;
41 }
42 void CompletePack(int cost)
43 {
44     for(int i=cost; i<=cash; ++i)
45         dp[i] = max(dp[i],dp[i-cost]+cost);
46 }
47 void ZeroOnePack(int cost)
48 {
49     for(int i=cash; i>=cost; --i)
50         dp[i] = max(dp[i],dp[i-cost]+cost);
51 }
52 void MultiplePack(int cnt, int cost)
53 {
54     if(cnt*cost >=cash)//如果第i种物品的费用总和超过背包容量,那么就是完全背包问题
55         CompletePack(cost);
56     else
57     {
58         int k = 1;//二进制拆分
59         while(k<cnt)//判断剩下的数字能不能够拆分为k
60         {
61             ZeroOnePack(cost*k);
62             cnt -=k;
63             k<<=1;
64         }
65         ZeroOnePack(cnt*cost);
66     }
67 }
68 int main()
69 {
70     //输入的处理以及函数的调用
71     return 0;
72 }
时间: 2024-10-13 19:30:05

背包九讲之4(混合三种背包问题)的相关文章

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

问题: 如果将P01.P02.P03混合起来.也就是说,有的物品只可以取一次(01背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包).应该怎么求解呢? 01背包与完全背包的混合: 考虑到在P01和P02中给出的伪代码只有一处不同,故如果只有两类物品:一类物品只能取一次,另一类物品可以取无限次,那么只需在对每个物品应用转移方程时,根据物品的类别选用顺序或逆序的循环即可,复杂度是O(VN).伪代码如下: for i=1..N if 第i件物品属于01背包 for v

背包九讲之七(有依赖的背包问题)

1 /* 2 即物品间存在依赖,比如i依赖于j,表示若选物品i,则必须选物品j 3 http://acm.hdu.edu.cn/showproblem.php?pid=3449 4 有很多个箱子,想买箱子中的物品必须先买下箱子,典型的依赖背包 5 将不依赖其他物品的物品称为主件,依赖其他物品的物品称为附件 6 我们有n个箱子,箱子里面的物品个数为cnt[i] 7 那么箱子称为主件,箱子里面的物品称为附件 8 那么考虑一个主件和它附件的集合,那么有2^n+1种策略,每种策略都是互斥的.所以它是分组

转载:《背包九讲》

<背包九讲> P01: 01背包问题 题目 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 基本思路 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放. 用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值.则其状态转移方程便是:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}. 这个方程非常重要,基

转载DD大神背包九讲

dd大牛的<背包九讲> P01: 01背包问题 题目 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 基本思路 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放. 用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值.则其状态转移方程便是:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}. 这个方程非

背包九讲【转文】

粘过来的文章有的符号都乱码了,只是留下作一备忘. 背包问题九讲2.0 beta1.2 2.0 beta 版本,修订历史及最新版本请访问https://github.com/tianyicui/pack 查阅. 本文版权归原作者所有,采用CC BY-NC-SA 协议发布. Contents 1 01 背包问题3 1.1 题目. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2 基本思路

背包九讲文档

dd大牛的<背包九讲> P01: 01背包问题 题目 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 基本思路 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放. 用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值.则其状态转移方程便是:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}. 这个方程非

dd大牛的背包九讲

每个人一开始学背包都是有点迷惑的(起码我就是), 当我看了dd大牛的背包九讲后便阔然开朗了,相信它对你也很有作用. P01: 01背包问题 题目 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 基本思路 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放. 用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值.则其状态转移方程便是:f[i]

转---背包九讲

目录 第一讲 01背包问题 第二讲 完全背包问题 第三讲 多重背包问题 第四讲 混合三种背包问题 第五讲 二维费用的背包问题 第六讲 分组的背包问题 第七讲 有依赖的背包问题 第八讲 泛化物品 第九讲 背包问题问法的变化 附:USACO中的背包问题 前言 本篇文章是我(dd_engi)正在进行中的一个雄心勃勃的写作计划的一部分,这个计划的内容是写作一份较为完善的NOIP难度的动态规划总结,名为<解动态规划题的基本思考方式>.现在你看到的是这个写作计划最先发布的一部分. 背包问题是一个经典的动态

背包九讲(转载,实在不知道哪个是原创了)

背包九讲 目录 第一讲 01背包问题 第二讲 完全背包问题 第三讲 多重背包问题 第四讲 混合三种背包问题 第五讲 二维费用的背包问题 第六讲 分组的背包问题 第七讲 有依赖的背包问题 第八讲 泛化物品 第九讲 背包问题问法的变化 附:USACO中的背包问题  前言 本篇文章是我(dd_engi)正在进行中的一个雄心勃勃的写作计划的一部分,这个计划的内容是写作一份较为完善的NOIP难度的动态规划总结,名为<解动态规划题的基本思考方式>.现在你看到的是这个写作计划最先发布的一部分. 背包问题是一