0-1背包问题-c语言实现
物品/容量 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
0/w=0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1/w=1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
2/w=2 |
0 |
1 |
6 |
7 |
7 |
7 |
7 |
7 |
7 |
7 |
7 |
7 |
3/w=5 |
0 |
1 |
6 |
7 |
7 |
18 |
19 |
24 |
25 |
25 |
25 |
25 |
4/w=6 |
0 |
1 |
6 |
7 |
7 |
18 |
22 |
24 |
28 |
29 |
29 |
40 |
5/w=7 |
0 |
1 |
6 |
7 |
7 |
18 |
22 |
28 |
29 |
34 |
35 |
40 |
价值v[]={0,1,6,18,22,28}
重量w[]={0,1,2,5,6,7}
背包容量T=11
上面是求最大价值公式,不是很容易看懂
下面图文是具体求最大价值的步骤:
c语言实现
动态规划-递归方法
自顶向下
#include <stdio.h>//0-1背包问题#define N 6 //
#define maxT 100
int c[N][maxT] = {0};int Memoized_Knapspsack(int v[N], int w[N], int T);
int Calculate_Max_Value(int v[N], int w[N], int i, int j);
/*
T: 背包容量
v[]:价值数组
w[]:重量数组
c[][]:c[i][j]表示前i个物品在背包容量为j的情况下最优装包方案所能获得的最大价值
*/
int Memoized_Knapspsack(int v[N], int w[N], int T){int i,j;for (i = 0; i < N; i++){for (j = 0; j < T; j++){c[i][j] = -1;}}return Calculate_Max_Value(v, w, N-1, T);}int Map_Knapspsack(int v[N], int w[N], int T){int i,j;for (i = 0; i < N; i++){for (j = 0; j < T+1; j++){printf("%2d ", Calculate_Max_Value(v, w, i, j));}printf("\n");}}int Calculate_Max_Value(int v[N], int w[N], int i, int j){int temp = 0;if(i == 0 || j == 0){c[i][j] = 0;}else{c[i][j] = Calculate_Max_Value(v, w, i-1, j); //1.if(i > 0 && j >= w[i]){ //当j < w[i]时c[i][j]一定是等于c[i-1][j]temp = Calculate_Max_Value(v, w, i-1, j-w[i]) + v[i]; //2.if(temp > c[i][j]){c[i][j] = temp; //3.}}}return c[i][j];
}int main(void){int v[] = {0,1,6,18,22,28};int w[] = {0,1,2,5,6,7};int T = 11;int result = Memoized_Knapspsack(v, w, T);printf("最大价值 = %d\n", result);Map_Knapspsack(v, w, T);return 0;
}
结果
0-1背包问题-c语言实现相关推荐
- 回溯法经典例题--0/1背包问题--C语言
问题描述: 设n个物品的编号为0~n-1,重量和价值分别用数组w[]与v[]存放,背包限制重量用W表示,X[]存放最优解,x[i]的值为0.1分别表示物品i不在.在背包内. 求解: ...
- C语言动态规划法解决0/1背包问题(详细解答)
动态规划法解决0/1背包问题(详细解答) 首先让我们回顾一下动态规划法的使用规则: 一..动态规划法的实现思路: 1.划分子问题:将元问题分解为若干个子问题,每一个子问题对应一个决策,并且子问题之间具 ...
- 0/1背包问题——动态规划、回溯、分支限界法对比
0/1背包问题--动态规划.回溯.分支限界法对比 2017.12.19 20:42:02 字数 3713 阅读 2820 目录 1.问题描述 1.1 问题描述 1.2 问题的数学表示(规划类问题,此种 ...
- 数据挖掘SPSS Clementine 12.0.3 多国语言(含中文)破解版
数据挖掘SPSS Clementine 12.0.3 多国语言(含中文)破解版 2013-01-11 13:05 2111人阅读 评论(0) 收藏 举报 本文章已收录于: 分类: 数据挖掘(3) 作者 ...
- 0/1背包问题——动态规划方法
1.定义 动态规划:把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解. 2.求解步骤 (1)找到状态转化条件 (2)归纳状态转移方程 (3)定义初始条件值 3.实例解析--0/1背包 ...
- 0/1背包问题-----回溯法求解
问题描述 有n个物品和一个容量为c的背包,从n个物品中选取装包的物品.物品i的重量为w[i],价值为p[i].一个可行的背包装载是指,装包的物品总重量不超过背包的重量.一个最佳背包装载是指,物品总价值 ...
- 0/1背包问题-----动态规划求解
问题描述 有n个物品和一个容量为c的背包,从n个物品中选取装包的物品.物品i的重量为w[i],价值为p[i].一个可行的背包装载是指,装包的物品总重量不超过背包的重量.一个最佳背包装载是指,物品总价值 ...
- 《计算复杂性:现代方法》——0.2 判定问题/语言
本节书摘来自华章计算机<计算复杂性:现代方法>一书中的第0章,第0.2节,作者 [美]桑杰夫·阿罗拉(Sanjeev Arora),博阿兹·巴拉克(Boaz Barak),译 骆吉洲,更多 ...
- JSP2.0中的表达式语言(EL表达式)
转载自 JSP2.0中的表达式语言(EL表达式) EL语法 EL的语法很简单,他最大的特点就是使用上很方便 例: ${sessionScope.user.sex} 所有EL都是以${ 为起始 ...
- 【动态规划】0/1背包问题
问题 H: [动态规划]0/1背包问题 时间限制: 1 Sec 内存限制: 64 MB 提交: 152 解决: 95 [提交] [状态] [讨论版] [命题人:admin] 题目描述 张琪曼和李旭 ...
最新文章
- 研究生失联19天,父母焦急求助!最后竟然是在写博士研究计划......
- 自控力极差的人如何自救?两个方法战胜拖延!
- AT4120-[ARC096D]Sweet Alchemy【贪心,背包】
- 检测Maven依赖中介
- 移动开发在路上-- IOS移动开发系列 多线程一 [转]
- 消息队列面试 - 如何进行消息队列架构设计?
- 使用NPM和Nodejs编写编译工具
- UI-148xLE-M相机参数
- K-Java WAP浏览器
- 无线网络管理工具wifi hoper在win7上的安装方法及推荐软件inSSIDer
- 70.(cesium之家)cesium接入天地图影像与注记(经纬度)
- 使用keycloak自定义SPI接入外部用户登录
- wg运行内存装MySQL8_搭建Mysql-proxy实现主从同步读写分离
- Win10 笔记本 共享 wifi 热点
- LabVIEW播放提示声音或者音乐
- Linux安装 CentOS 7
- Java 验证回文串
- Matlab中ind2gray函数用法
- 【CYH-01】小奔的国庆练习赛:赛后标程
- 高考完当天,你做的第一件事是什么?