博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态规划法求背包问题
阅读量:6721 次
发布时间:2019-06-25

本文共 1417 字,大约阅读时间需要 4 分钟。

0-1背包问题是指给定一个容量一定的背包和一系列已知重量和价值的物品,从中选择一些物品放入背包使得背包中物品的总价值最大.

背包问题可以用动态规划,回溯法或者贪心算法求解.这里介绍使用动态规划法求解0-1背包问题.

动态规划法需要几个数组来辅助:

  • m: 背包最大容量

  • n: 物品的个数

  • w[i] : 第i个物品的重量

  • v[i]: 第i个物品的价值

  • c[i][j]: 前i个物品放入容量为j的背包最大的价值

动态规划法的最终目的是填写二维数组c,c[n][m]即为原问题的结果.

为了方便起见下标从1开始, i表示物品编号, j表示当前容量.先行后列,从上到下,从左到右填写二维数组c.

  • 若总容量小于物品质量(j < w[i]), 当前最大价值不变(c[i][j] = c[i-1][j])

  • 前i-1个物品选择装入第i个物品后正好装满的方案(c[i-1][j-w[i]]), 若装入后价值比前i-1个物品最大价值(c[i-1][j])更大,则装入第i个物品;

  • 否则保留前i-1个物品最大价值(c[i-1][j])

上述三种状态下

举一个简单的例子:

背包最大容量为10,有三个物品重量和价值分别为: (3,4),(4,5), (5,6),求背包最大价值.

填写二维数组c:

0 0 4 4 4 4 4 4  4  4 0 0 4 5 5 5 9 9  9  90 0 4 5 6 6 9 10 11 11

由此可知最大价值为11.

一言不发就丢代码:

#include 
#define M 128#define N 32int m = 0, n = 0;int c[N][M] = {0};int w[N] = {0};int v[N] = {0};void npack() { int i, j; for (j=1; j <= m; j++) { for (i=1; i <= n; i++) { if (j < w[i]) { c[i][j] = c[i-1][j]; continue; } else if(c[i-1][j-w[i]] + v[i] > c[i-1][j]) { c[i][j] = c[i-1][j-w[i]] + v[i]; } else { c[i][j] = c[i-1][j]; } } }}int main() { int i, j; // input scanf("%d %d", &m, &n); for (i = 1; i <= n; i++) { scanf("%d %d", &w[i], &v[i]); } npack(); for (i = 1; i <= n; i++) { for (j = 1; j <= m; j++) { printf("%4d ", c[i][j]); } printf("\n"); } return 0;}

转载地址:http://jgcmo.baihongyu.com/

你可能感兴趣的文章
mysql导入大量数据时报MySQL server has gone away错误的解决办法
查看>>
socket简单理解
查看>>
过滤HTML
查看>>
临时表 表变量 游标
查看>>
关于 iTunes Store 授权和取消授权
查看>>
React文档(十三)思考React
查看>>
公司部门和职位
查看>>
python内置函数中的map,filter,reduce函数例子
查看>>
我的Android进阶之旅------>对Java中注释/**@hide*/的初步认识
查看>>
mybatis--Mapper 常见报错总结(持续总结)
查看>>
一个农民工写的Json组件,让大神们情何以堪.
查看>>
Python3向网页POST数据
查看>>
经常生气的人,身体有什么变化?
查看>>
linux之SQL语句简明教程---CREATE VIEW
查看>>
CentOS7.4中安装MySQL5.6
查看>>
LeetCode OJ - Gas Station
查看>>
MacOSX中降频的方法
查看>>
audio音频暂停和播放
查看>>
Windows下安装Python requests模块
查看>>
java图形用户界面边界布局管理器
查看>>