算法实验2:0-1背包问题的动态规划算法实现

0-1背包问题的动态规划算法实现

一、实验目的和要求:

1.掌握动态规划算法思想。
2.掌握最优子结构原理。
3.了解动态规划一般问题,并利用动态规划解决0-1背包问题。

二、实验环境:

VS2019 – .cpp文件

三、算法描述及实验步骤

1.问题描述:

给定n个物品和一个背包。物品i的重量为wi,价值为vi,背包容量为c。
如何选择装入背包中的物品,使得装入背包的物品的价值最大?
注:每种物品i只有两种选择,装入或者不装入,既不能装入多次,也不能只装入一部分。

2.问题形式化描述:

给定c>0,wi>0,vi>0,1≤i≤n,求n元0-1向量(x1, x2, …, xn),使得

算法实验2:0-1背包问题的动态规划算法实现_第1张图片

3.0-1背包问题的递归式

0-1 背包问题具有最优子结构性质,可以据此定义递归关系,建立递归方程,并以自底向上的方式计算最优值,根据计算最优值时的得到的信息,构造最优解。

在这里插入图片描述
在这里插入图片描述

设所给 0-1 背包问题的子问题的最优值 m(i,j) ,即 m(i,j) 是背包重量为 j ,可选物品为 i,i+1,…,n-1 时的最优值。由最优子结构性质,可以计算出 m(i,j) 的递归式如下:

在这里插入图片描述
在这里插入图片描述

面对每个物品,我们只有拿取或者不拿两种选择,不能选择装入某物品的一部分,也不能装入同一物品多次。首先,声明一个大小为m[n][c]的二维数组,m[ i ][ j ] 表示在面对第i件物品,且背包容量为 j时所能获得的最大价值 ,那么我们可以很容易分析得出 m[i][j] 的计算方法:
1)0 2)j>w[i] 的情况,这时背包容量可以放下第 i 件物品,我们就要考虑拿这件物品是否能获取更大的价值。
如果拿取,m[ i ][ j ]=m[ i-1 ][ j-w[ i ] ] + v[ i ]。这里的m[ i-1 ][ j-w[ i ] ]指的就是考虑了i-1件物品,背包容量为j-w[i]时的最大价值,也是相当于为第i件物品腾出了w[i]的空间。
如果不拿,m[ i ][ j ] = m[ i-1 ][ j ]。,比较这两种情况哪种价值最大进行选举。

算法实验2:0-1背包问题的动态规划算法实现_第2张图片

4.算法描述

用二维数组m[i][j], 0≤j≤c, 来存储m(i, j)的值。
求解0-1背包问题就是在二维数组m中填入相应的值。
m[1][c]中的值就是该背包问题的解
二维数组m中最先填入物品n的最优解m(n, j):
若0≤j<wn,m[n][j]=0;
若j≥wn,m[n][j]=vn。

构造最优解(x1,x2,…,xn)算法:
如果m[1][c]=m[2][c], 则x1=0, 否则x1=1;
如果x1=0, 则由m[2][c]构造解;
如果x1=1, 则由m[2][c-w1]构造解;
依次类推,可构造出相应的最优解: (x1,x2,…,xn)

四、调试过程及实验结果

输入值:
背包容量:16
可携带物品数量:8
各物品重量:2 3 6 5 1 4 8 1
各物品价值:6 2 1 6 5 4 3 2
达到最大价值的最优解为:1 1 0 1 1 1 0 1
实验结果:
算法实验2:0-1背包问题的动态规划算法实现_第3张图片

实验所得二维表:

算法实验2:0-1背包问题的动态规划算法实现_第4张图片
算法实验2:0-1背包问题的动态规划算法实现_第5张图片

算法实验2:0-1背包问题的动态规划算法实现_第6张图片

最后分享

0-1背包问题的动态规划算法实现 cpp+报告

你可能感兴趣的:(动态规划)