c语言-完全背包问题

完全背包问题

问题:有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

分析:

这个算法使用一维数组,先看伪代码:

for i=1..N
    for v=0..V
        f[v]=max{f[v],f[v-cost]+weight}

这个伪代码与P01的伪代码只有v的循环次序不同而已。
为什么这样一改就可行呢?首先想想为什么P01中要按照v=V..0的逆序来循环。这是因为要保证第i次循环中的状态f[i][v]是由状态f[i-1]
[v-c[i]]递推而来。换句话说,这正是为了保证每件物品只选一次,保证在考虑“选入第i件物品”这件策略时,依据的是一个绝无已经选入第i件物品的
子结果f[i-1][v-c[i]]。而现在完全背包的特点恰是每种物品可选无限件,所以在考虑“加选一件第i种物品”这种策略时,却正需要一个可能已选入第i种物品的子结果f[i][v-c[i]],所以就可以并且必须采用v=0..V的顺序循环。这就是这个简单的程序为何成立的道理。

代码实现:


 1 /****************完全背包**********************/
2 #include <iostream>
3
4 using namespace std;
5 const int V=1000;//定义体积
6 const int T=5;//定义物品的种类
7 int f[V+1];
8 int c[]={400,200,500,200,900};
9 int w[]={3,1,9,7,5};
10 #define INF -65536
11 #define EMPTY
12 int package()
13 {
14 #ifdef EMPTY//条件编译,可以不装满
15 for(int i=0;i<=V;i++)
16 {
17 f[i]=0;
18 }
19 #else//条件编译,必须装满
20 f[0]=0;
21 for(int i=1;i<=V;i++)
22 {
23 f[i]=INF;
24 }
25 #endif
26 for(int i=0;i<T;i++)
27 {
28 for(int v=V;v>=c[i];v--)
29 {
30 f[v]=max(f[v],f[v-c[i]]+w[i]);
31 }
32 }
33 return f[V];
34 }
35
36 int main()
37 {
38 int temp;
39 for(int i=0;i<T;i++)
40 {
41 cout<<c[i]<<" ";
42 }
43 cout<<endl;
44 for(int i=0;i<T;i++)
45 {
46 cout<<w[i]<<" ";
47 }
48 cout<<endl;
49 temp=package();
50 cout<<temp<<endl;
51 return 0;
52 }

c语言-完全背包问题

时间: 2024-08-06 02:55:38

c语言-完全背包问题的相关文章

C语言-多重背包问题

多重背包问题 问题:有N种物品和一个容量为V的背包.第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 分析: 这题目和完全背包问题很类似.基本的方程只需将完全背包问题的方程略微一改即可,因为对于第i种物品有n[i]+1种策略:取0件,取1件--取n[i]件.令f[i][v]表示前i种物品恰放入一个容量为v的背包的最大权值,则有状态转移方程: f[i][v]=max{f[i-1][v-k*c[i]]+k

c语言-01背包问题

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]} 这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的.所以有必要将它

关于几个背包问题(C语言)

个人新学的几个背包问题,做下记录总结.(参考博客:http://blog.csdn.net/mu399/article/details/7722810  以及 http://blog.csdn.net/u013174702/article/details/45741395) (1)01背包: 01背包的状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi,  f[i-1,j] } f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值. Pi表示第

C语言-二维背包问题

二维费用背包问题 问题: 二维费用的背包问题是指:对于每件物品,具有两种不同的费用:选择这件物品必须同时付出这两种代价:对于每种代价都有 一个可付出的最大值(背包容量).问怎样选择物品可以得到最大的价值.设这两种代价分别为代价1和代价2,第i件物品所需的两种代价分别为a[i]和 b[i].两种代价可付出的最大值(两种背包容量)分别为V和U.物品的价值为w[i]. 分析: 费用加了一维,只需状态也加一维即可.设f[i][v][u]表示前i件物品付出两种代价分别为v和u时可获得的最大价值.状态转移方

背包问题-C语言实现

转自:http://blog.csdn.net/tjyyyangyi/article/details/7929665 0-1背包问题 参考: http://blog.csdn.net/liwenjia1981/article/details/5725579 http://blog.csdn.net/dapengbusi/article/details/7463968 动态规划解法 借个图 助于理解 从背包容量为0开始,1号物品先试,0,1,2,的容量都不能放.所以置0,背包容量为3则里面放4.这

从01背包问题理解动态规划---初体验

01背包问题具体例子:假设现有容量10kg的背包,另外有3个物品,分别为a1,a2,a3.物品a1重量为3kg,价值为4:物品a2重量为4kg,价值为5:物品a3重量为5kg,价值为6.将哪些物品放入背包可使得背包中的总价值最大? 这个问题有两种解法,动态规划和贪婪算法.本文仅涉及动态规划. 先不套用动态规划的具体定义,试着想,碰见这种题目,怎么解决? 首先想到的,一般是穷举法,一个一个地试,对于数目小的例子适用,如果容量增大,物品增多,这种方法就无用武之地了. 其次,可以先把价值最大的物体放入

《算法导论》读书笔记之第16章 0-1背包问题—动态规划求解

原文:http://www.cnblogs.com/Anker/archive/2013/05/04/3059070.html 1.前言 前段时间忙着搞毕业论文,看书效率不高,导致博客一个多月没有更新了.前段时间真是有些堕落啊,混日子的感觉,很少不爽.今天开始继续看算法导论.今天继续学习动态规划和贪心算法.首先简单的介绍一下动态规划与贪心算法的各自特点及其区别.然后针对0-1背包问题进行讨论.最后给出一个简单的测试例子,联系动态规划实现0-1背包问题. 2.动态规划与贪心算法 关于动态规划的总结

C语言-让生活更美好

1.智能车 1)避障车 2)平衡车 3)WIFI视频车 2.萝莉语音温度播报 3.万年不变的万年历 4.采矿致富车--------------电赛作品--金属探测车 5.基于物联网的家庭安防系统-----九宫格解锁(隔空解锁) 6.基于心理治疗的儿童电子琴 7.蓝牙防丢器 8.操作系统 9.喂水器:(小狗走近就会滴水) 10.喂食器:(小狗走近就会落食) 举几个用c开发的程序例子. QQ notepad(记事本).notepad++.notepad2 pidgin(全平台的聊天软件) apach

背包问题问法的变化(背包九讲)

前言: 以上涉及的各种背包问题都是要求在背包容量(费用)的限制下求可以取到的最大价值,但背包问题还有很多种灵活的问法,在这里值得提一下.但是我认为,只要深入理解了求背包问题最大价值的方法,即使问法变化了,也是不难想出算法的.例如,求解最多可以放多少件物品或者最多可以装满多少背包的空间.这都可以根据具体问题利用前面的方程求出所有状态的值(f数组)之后得到.还有,如果要求的是"总价值最小""总件数最小",只需简单的将上面的状态转移方程中的max改成min即可.下面说一些