0/1 背包问题动态规划详解及C代码

0/1 背包问题动态规划详解及C代码

动态规划是用空间换时间的一种方法的抽象。其关键是发现子问题和记录其结果。然后利用这些结果减轻运算量。

比如01背包问题。

/* 一个旅行者有一个最多能用M公斤的背包,现在有N件物品,

它们的重量分别是W1,W2,...,Wn,

它们的价值分别为P1,P2,...,Pn.

若每种物品只有一件求旅行者能获得最大总价值。

输入格式:

M,N

W1,P1

W2,P2

......

输出格式:

X

*/

因为背包最大容量M未知。所以,我们的程序要从1到M一个一个的试。比如,开始任选N件物品的一个。看对应M的背包,能不能放进去,如果能放进去,并且还有多的空间,则,多出来的空间里能放N-1物品中的最大价值。怎么能保证总选择是最大价值呢?看下表。

测试数据:

10,3

3,4

4,5

5,6

c[i][j]数组保存了1,2,3号物品依次选择后的最大价值.

这个最大价值是怎么得来的呢?从背包容量为0开始,1号物品先试,0,1,2,的容量都不能放.所以置0,背包容量为3则里面放4.这样,这一排背包容量为4,5,6,....10的时候,最佳方案都是放4.假如1号物品放入背包.则再看2号物品.当背包容量为3的时候,最佳方案还是上一排的最价方案c为4.而背包容量为5的时候,则最佳方案为自己的重量5.背包容量为7的时候,很显然是5加上一个值了。加谁??很显然是7-4=3的时候.上一排 c3的最佳方案是4.所以。总的最佳方案是5+4为9.这样.一排一排推下去。最右下放的数据就是最大的价值了。(注意第3排的背包容量为7的时候,最佳方案不是本身的6.而是上一排的9.说明这时候3号物品没有被选.选的是1,2号物品.所以得9.)

从以上最大价值的构造过程中可以看出。

f(n,m)=max{f(n-1,m), f(n-1,m-w[n])+P(n,m)}这就是书本上写的动态规划方程.这回清楚了吗?

下面是实际程序(在VC 6.0环境下通过):

#include

int c[10][100];/*对应每种情况的最大价值*/

int knapsack(intm,int n)

{

int i,j,w[10],p[10];

printf("请输入每个物品的重量,价值:\n");

for(i=1;i

scanf("%d,%d",&w[i],&p[i]);

for(i=0;i

for(j=0;j

c[i][j]=0;/*初始化数组*/

for(i=1;i

for(j=1;j

{

if(w[i]

{

if(p[i]+c[i-1][j-w[i]]>c[i-1][j])

/*如果本物品的价值加上背包剩下的空间能放的物品的价值*/

/*大于上一次选择的最佳方案则更新c[i][j]*/

c[i][j]=p[i]+c[i-1][j-w[i]];

else

c[i][j]=c[i-1][j];

}else /*如果当前物品的容量小于背包容量,即此物品装不下!*/

c[i][j]=c[i-1][j];

}

return(c[n][m]);

}

int main()

{

int m,n;int i,j;

printf("请输入背包的承重量,物品的总个数:\n");

scanf("%d,%d",&m,&n);

printf("旅行者背包能装的最大总价值为%d",knapsack(m,n));

printf("\n");

return 0;

}

0/1 背包问题动态规划详解及C代码

动态规划是用空间换时间的一种方法的抽象。其关键是发现子问题和记录其结果。然后利用这些结果减轻运算量。

比如01背包问题。

/* 一个旅行者有一个最多能用M公斤的背包,现在有N件物品,

它们的重量分别是W1,W2,...,Wn,

它们的价值分别为P1,P2,...,Pn.

若每种物品只有一件求旅行者能获得最大总价值。

输入格式:

M,N

W1,P1

W2,P2

......

输出格式:

X

*/

因为背包最大容量M未知。所以,我们的程序要从1到M一个一个的试。比如,开始任选N件物品的一个。看对应M的背包,能不能放进去,如果能放进去,并且还有多的空间,则,多出来的空间里能放N-1物品中的最大价值。怎么能保证总选择是最大价值呢?看下表。

测试数据:

10,3

3,4

4,5

5,6

c[i][j]数组保存了1,2,3号物品依次选择后的最大价值.

这个最大价值是怎么得来的呢?从背包容量为0开始,1号物品先试,0,1,2,的容量都不能放.所以置0,背包容量为3则里面放4.这样,这一排背包容量为4,5,6,....10的时候,最佳方案都是放4.假如1号物品放入背包.则再看2号物品.当背包容量为3的时候,最佳方案还是上一排的最价方案c为4.而背包容量为5的时候,则最佳方案为自己的重量5.背包容量为7的时候,很显然是5加上一个值了。加谁??很显然是7-4=3的时候.上一排 c3的最佳方案是4.所以。总的最佳方案是5+4为9.这样.一排一排推下去。最右下放的数据就是最大的价值了。(注意第3排的背包容量为7的时候,最佳方案不是本身的6.而是上一排的9.说明这时候3号物品没有被选.选的是1,2号物品.所以得9.)

从以上最大价值的构造过程中可以看出。

f(n,m)=max{f(n-1,m), f(n-1,m-w[n])+P(n,m)}这就是书本上写的动态规划方程.这回清楚了吗?

下面是实际程序(在VC 6.0环境下通过):

#include

int c[10][100];/*对应每种情况的最大价值*/

int knapsack(intm,int n)

{

int i,j,w[10],p[10];

printf("请输入每个物品的重量,价值:\n");

for(i=1;i

scanf("%d,%d",&w[i],&p[i]);

for(i=0;i

for(j=0;j

c[i][j]=0;/*初始化数组*/

for(i=1;i

for(j=1;j

{

if(w[i]

{

if(p[i]+c[i-1][j-w[i]]>c[i-1][j])

/*如果本物品的价值加上背包剩下的空间能放的物品的价值*/

/*大于上一次选择的最佳方案则更新c[i][j]*/

c[i][j]=p[i]+c[i-1][j-w[i]];

else

c[i][j]=c[i-1][j];

}else /*如果当前物品的容量小于背包容量,即此物品装不下!*/

c[i][j]=c[i-1][j];

}

return(c[n][m]);

}

int main()

{

int m,n;int i,j;

printf("请输入背包的承重量,物品的总个数:\n");

scanf("%d,%d",&m,&n);

printf("旅行者背包能装的最大总价值为%d",knapsack(m,n));

printf("\n");

return 0;

}


相关文章

  • 背包问题九讲
  • 背包问题九讲2.0RC1 崔添翼(TianyiCui)* 2011-09-28† 本文题为<背包问题九讲>,从属于<动态规划的思考艺术>系列. 这系列文章的第一版于2007年下半年使用EmacsMuse制作,以HTM ...查看


  • 背包问题九讲_DOC版
  • 背包问题九讲 2008.4 背包问题九讲 v1.0 目录 第一讲 01背包问题 第二讲 完全背包问题 第三讲 多重背包问题 第四讲 混合三种背包问题 第五讲 二维费用的背包问题 第六讲 分组的背包问题 第七讲 有依赖的背包问题 第八讲 泛化 ...查看


  • 算法设计与分析论文
  • 贪心算法 --不在贪心中爆发,就在贪心中灭亡 武汉理工大学计算机科学与技术学院班 摘要 本文介绍贪心算法的基本意义以及算法的使用范围,并通过具体的案例来分析贪心算法的具体应用,从而指出其特点和存在问题. 关键字:贪心算法,贪心策略,TSP. ...查看


  • 贪心算法 实验二报告
  • 实验二 贪心选择算法 姓名 : 田圆圆 学号:2013125135 一.实验目的与要求: 理解贪心选择算法的思想. 二.预习与准备:贪心选择算法思想: (1)贪心选择能得到问题的最优解,要证明我们所做的第一步选择一定包含在一个最优解总,即存 ...查看


  • 中南大学算法实验报告
  • 算法分析与设计 实验报告 学院: 信息科学与工程学院 专业班级: i got7 指导老师: 学号: i got7 姓名: 鸟宝宝 a. 合并排序 合并排序是分治法的应用,把需要排序的数组A[1 - n],一分为二A[1 -n/2]和A[n/ ...查看


  • MFC设计背包问题课程设计
  • 课程设计 课程 面向对象程序设计课程设计 题目 背包问题的求解 院系名称 计算机学院 班 级 学生姓名 afan 学 号 组 员 指导教师 时 间 2014.12.01 1 问题要求及任务描述 1.1 题目要求 假设有一个能装入总体积为T的 ...查看


  • 基于贪心算法的0_1背包问题
  • ISSN1009-3044第6卷第35期(2010年12月)与技术ComputerKnowledgeandTechnology电脑知识 Vol.6,No.35,December2010,pp.10061-10062E-mail:xsjl@c ...查看


  • 动态规划法
  • 第5章 5.1 5.2 5.3 5.4 概 动态规划法 述 图问题中的动态规划法 组合问题中的动态规划法 查找问题中的动态规划法 5.1 5.1.1 5.1.2 5.1.3 概 述 最优化问题 最优性原理 动态规划法的设计思想 5.1.1 ...查看


  • 算法设计与分析复习题目及答案
  • 分治法 1.二分搜索算法是利用( 分治策略)实现的算法. 9. 实现循环赛日程表利用的算法是(分治策略 ) 27.Strassen矩阵乘法是利用(分治策略 )实现的算法. 34.实现合并排序利用的算法是(分治策略 ). 实现大整数的乘法是利 ...查看


热门内容