动态规划0或1背包问题

一、实验内容

1、实验题目

0/1背包问题:给定n 中物品和一个背包,物品i 的重量是wi ,价值是vi ,背包的容量为c 。

2、实验目的

(1)深刻理解并掌握动态规划算法的设计思想;

(2)利用动态规划方法设计背包问题算法,掌握动态规划法

的基本思想和算法设计的基本步骤。

3、实验要求

设计0/1背包问题的动态规划算法,要求输出背包内物品

的最大价值以及选入背包的物品种类。利用c++语言实现

算法,给出程序的正确运行结果。

4、算法设计思想

0/1背包为题可以看作是决策一个序列(x1,x2······xn ),对任何一个变量xi 的 决策是决定xi=1还是xi=0.对xi-1决策后,已经确定了(x1,······xi-1),在决策 Xi 时问题处于下列两种状态之一:

①背包容量不足以装入物品i 则xi=0,背包不增加价值;

②背包容量可以装入物品i ,则xi=1,背包的价值就增加了vi 。

这两种情况下背包价值的最大者应该是对xi 决策后的背包价值。令V (i ,j )表 示在前i(1

V(i,0)=V(0,j)=0

j

j>=Wi :V(i,j)=max{V(i-1,j),V(i-1,j-wi)+vi}

二、代码和运行结果截图

1、代码

#include

#include

#define n 5 //5种物品的一个背包

#define C 10 //背包容量

struct KnapSack

{

int w[C]; //n个物品的重量存储在数组w[]中

int v[n]; //n个物品的价值存储在数组v[]中

}knapsack;

int max(int a,int b) //求最大值

{

if(a>=b)

return a;

else

return b;

}

void main()

{

int V[n+1][C+1];

int i,j;

int si;

int vi;

int X; //X=0或X=1 判断物品是否装入

cout

for(i=1;i

{

cin>>knapsack.w[i]; //第i 个物品的重量 cin>>knapsack.v[i]; //第i 个物品的价值 }

cout

cout

cout

for(i=1;i

{

cout

|

cout

}

for(i=0;i

{

V[i][0]=0;

}

for(j=0;j

{

V[0][j]=0;

}

for(i=1;i

V[i][0]=0;

si=knapsack.w[i];

vi=knapsack.v[i];

for(j=1;j

{

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

if(si

{

V[i][j]=max(V[i][j],V[i-1][j-si]+vi);

}

}

}

cout

cout

for(i=0;i

{

cout

for(j=0;j

cout

cout

for(i=0;i

{

if(V[i][C]

X=1; //装入

else

X=0; //不装入

cout

}

2、运行结果截图

三、实验结果分析

动态规划算法是将待求解的问题分解成若干个子问题,但各子问题中往往是不相互独立的。动态规划算法将每个子问题只求解一次并将其保存在一个表格中,当在此求解此问

题时,只是简单的通过查表获得该子问题的解,从而避免了大量的重复计算。通过用动态算法思想对0/1背包问题算法的设计、调试我对动态规划的思想有了初步的了解和简单的应用。

一、实验内容

1、实验题目

0/1背包问题:给定n 中物品和一个背包,物品i 的重量是wi ,价值是vi ,背包的容量为c 。

2、实验目的

(1)深刻理解并掌握动态规划算法的设计思想;

(2)利用动态规划方法设计背包问题算法,掌握动态规划法

的基本思想和算法设计的基本步骤。

3、实验要求

设计0/1背包问题的动态规划算法,要求输出背包内物品

的最大价值以及选入背包的物品种类。利用c++语言实现

算法,给出程序的正确运行结果。

4、算法设计思想

0/1背包为题可以看作是决策一个序列(x1,x2······xn ),对任何一个变量xi 的 决策是决定xi=1还是xi=0.对xi-1决策后,已经确定了(x1,······xi-1),在决策 Xi 时问题处于下列两种状态之一:

①背包容量不足以装入物品i 则xi=0,背包不增加价值;

②背包容量可以装入物品i ,则xi=1,背包的价值就增加了vi 。

这两种情况下背包价值的最大者应该是对xi 决策后的背包价值。令V (i ,j )表 示在前i(1

V(i,0)=V(0,j)=0

j

j>=Wi :V(i,j)=max{V(i-1,j),V(i-1,j-wi)+vi}

二、代码和运行结果截图

1、代码

#include

#include

#define n 5 //5种物品的一个背包

#define C 10 //背包容量

struct KnapSack

{

int w[C]; //n个物品的重量存储在数组w[]中

int v[n]; //n个物品的价值存储在数组v[]中

}knapsack;

int max(int a,int b) //求最大值

{

if(a>=b)

return a;

else

return b;

}

void main()

{

int V[n+1][C+1];

int i,j;

int si;

int vi;

int X; //X=0或X=1 判断物品是否装入

cout

for(i=1;i

{

cin>>knapsack.w[i]; //第i 个物品的重量 cin>>knapsack.v[i]; //第i 个物品的价值 }

cout

cout

cout

for(i=1;i

{

cout

|

cout

}

for(i=0;i

{

V[i][0]=0;

}

for(j=0;j

{

V[0][j]=0;

}

for(i=1;i

V[i][0]=0;

si=knapsack.w[i];

vi=knapsack.v[i];

for(j=1;j

{

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

if(si

{

V[i][j]=max(V[i][j],V[i-1][j-si]+vi);

}

}

}

cout

cout

for(i=0;i

{

cout

for(j=0;j

cout

cout

for(i=0;i

{

if(V[i][C]

X=1; //装入

else

X=0; //不装入

cout

}

2、运行结果截图

三、实验结果分析

动态规划算法是将待求解的问题分解成若干个子问题,但各子问题中往往是不相互独立的。动态规划算法将每个子问题只求解一次并将其保存在一个表格中,当在此求解此问

题时,只是简单的通过查表获得该子问题的解,从而避免了大量的重复计算。通过用动态算法思想对0/1背包问题算法的设计、调试我对动态规划的思想有了初步的了解和简单的应用。


相关内容

  • 第4章贪心算法(0-算法思想)
  • 第4章 贪心算法 1 学习要点  贪心算法的基本思想  贪心算法的基本要素 (1)最优子结构性质 (2)贪心选择性质 贪心算法与动态规划算法的差异 正确性的证明 范例学习贪心设计策略 (1)活动安排问题: (4)单源最短路径: (2)最优装载问题: (5)最小生成树: (3)哈夫曼编码: (6) ...

  • 动态规划基本原理
  • 动态规划基本原理 近年来,涉及动态规划的各种竞赛题越来越多,每一年的NOI几乎都至少有一道题目需要用动态规划的方法来解决:而竞赛对选手运用动态规划知识的要求也越来越高,已经不再停留于简单的递推和建模上了. 要了解动态规划的概念,首先要知道什么是多阶段决策问题. 一.多阶段决策问题 如果一类活动过程可 ...

  • 20151112-JWJ-Algorithm-12-贪心算法
  • 湖南大学-算法设计与分析课程 Lecture 12-贪心算法 姜文君 [email protected] 办公室:信息科学与工程学院院楼326 2015-2016第一学期 回 顾 动态规划6案例, 矩阵连乘.最长公共子序列. 最大子段和可扩展. 凸多边形最优三角剖分. 多边形游戏更一般. 0-1背包为经 ...

  • 算法实验报告
  • 实验一快速排序 一问题描述 实现对数组的普通快速排序与随机快速排序 二实验要求 (1)实现上述两种排序方法 (2)统计算法运行时间 (3)分析性能差异,做出总结 三算法原理 (1)快速排序原理: 每次将数组最后一个元素作为基准,对待排数组进行分组,使基准元素左边的数据比基准数据要小,右边的数据比基准 ...

  • 数据结构第三章参考答案
  • 习题3 1. 填空题 (1)栈的进出原则是(___________),队列的进出原则是(___________). 答案:后进先出(LIFO ) 先进先出(FIFO ) (2)设32位计算机系统中,空栈S 存储int 型数据,栈顶指针为1024H .经过操作序列 push(1),push(2),po ...

  • 实验2++动态规划算法
  • 淮海工学院计算机工程学院 实验报告书 课程名: <算法分析与设计> 题 目: 实验2 动态规划算法 班 级: 学 号: 姓 名: < 算法分析与设计>实验报告 - 1 - 实验2 动态规划算法 实验目的和要求 (1)深刻掌握动态规划法的设计思想并能熟练运用: (2)理解这样一 ...

  • 背包问题九讲笔记_01背包 - CSDN博客
  • 摘自Tianyi Cui童鞋的<背包问题九讲>,稍作修改,方便理解. 01背包问题描述 已知:有一个容量为V的背包和N件物品,第i件物品的重量是weight[i],收益是cost[i]. 限制:每种物品只有一件,可以选择放或者不放 问题:在不超过背包容量的情况下,最多能获得多少价值或收益 ...

  • matlab中回溯算法
  • 第 4 章 回溯 寻找问题的解的一种可靠的方法是首先列出所有候选解,然后依次检查每一个,在检查完所有或部分候选解后,即可找到所需要的解.理论上,当候选解数量有限并且通过检查所有或部分候选解能够得到所需解时,上述方法是可行的.不过,在实际应用中,很少使用这种方法,因为候选解的数量通常都非常大(比如指数 ...

  • 中南大学算法实验报告
  • 算法设计与分析基础 --实验报告 姓名: 周建权 学号: 0909122820 班级: 信安1202 实验一 分治 -最近点对 一.问题 Problem Have you ever played quoit in a playground? Quoit is a game in which flat ...