当前位置: 首页 > news >正文

0-1 knappack(0-1背包问题)

常见的算法有:

  1. 枚举
  2. 贪心
  3. 动态规划
  4. 搜索
  5. 分治和递归

0-1背包是个典型的动态规划算法。

啰嗦一句,动态规划属于运筹学,美国数学家bellman是运筹学的创建者。

0-1背包代码的逻辑如下:

v a l ( i , p ) = v a l ( i − 1 , p ) , p ≥ w i , 0 ≤ p < w i v a l ( i , p ) = m a x ( v a l ( i − 1 , p ) , v a l ( i − 1 , p − w i ) + v i ) , p ≥ w i val(i,p) = val (i -1, p), p \ge w_i, 0 \le p \lt w_i \\ val(i,p) = max (val (i -1, p) ,val(i - 1, p - w_i) + v_i), p \ge w_i val(i,p)=val(i1,p),pwi,0p<wival(i,p)=max(val(i1,p),val(i1,pwi)+vi),pwi

代码中,需要注意以下几点问题:

  1. 代码中j为0也是合法的。
  2. 为什么“val[capacity]”是最后的解?
  3. 代码逻辑是:先用序号0的物品转满背包,然后从1号物品开始,逐个取出以前装入的物品,并判断新的物品和已装入物品的价值哪个高。因为每种物品的重量不同,所以需要将已装入的物品逐一全部取出,并计算新旧物品的价值大小。
  4. 0-1背包使用贪心算法可能无法得到最优解的原因是什么?

代码如下:

#include "knapsack.h"#include <stdio.h>#include <string.h>#define MAX_ARRAY_SIZE 1024unsigned int knapsack(unsigned int n, unsigned int*v, unsigned int*w, unsigned int capacity) {unsigned int val[MAX_ARRAY_SIZE] = { 0 };for (int i = 0; i < n; i++) {for (int j = capacity; j >= 0; j--) {int t = val[j - w[i]] + v[i];if (j >= w[i] && val[j] < t) {val[j] = t;}}}return val[capacity];
}int knapsackTest() {unsigned int i, n, c, w[MAX_ARRAY_SIZE],v[MAX_ARRAY_SIZE];int ret = 0;printf("input the number[2-%d]:\r\n", MAX_ARRAY_SIZE);ret = scanf("%d", &n);printf("input the capacity[above 0]:\r\n");ret = scanf("%d", &c);for (int i = 0; i < n; i++) {printf("input weight(remain %d):\r\n",n - i);ret = scanf("%d", &w[i]);}for (int i = 0; i < n; i++) {printf("input value(remain %d):\r\n", n - i);ret = scanf("%d", &v[i]);}unsigned int result = knapsack(n, v, w, c);printf("knapsack:%u\r\n", result);return 0;
}

运行结果:

在这里插入图片描述

完整代码地址:https://github.com/satadriver/dataStruct

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Go 正则匹配之跨行匹配
  • 3D换肤在服装行业的应用
  • 基于metersphere和supper-jacoco 测试覆盖率落地实践
  • 中科亿海微UART协议
  • 【PTA-C语言】实验七-函数与指针I
  • 一文初识Linux进程(超详细!)
  • 3D动态路障生成
  • 计算字符串的长度几种方法 | 递归 | 指针减指针 | 计数器 | C语言 | 详解 | 期末考试必看!!!
  • 研讨会分享 | 非遗文化的守正创新与数字化传播
  • Eureka注册及使用
  • 【Linux】Linux 下基本指令 -- 详解
  • C语言---扫雷(Minesweeper)
  • 算法练习Day25 (Leetcode/Python-贪心算法)
  • Halcon闭运算closing
  • c语言内嵌汇编知识点记录
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 03Go 类型总结
  • 30天自制操作系统-2
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Apache的80端口被占用以及访问时报错403
  • Facebook AccountKit 接入的坑点
  • FastReport在线报表设计器工作原理
  • idea + plantuml 画流程图
  • IP路由与转发
  • Java 最常见的 200+ 面试题:面试必备
  • JWT究竟是什么呢?
  • springMvc学习笔记(2)
  • storm drpc实例
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • 订阅Forge Viewer所有的事件
  • 简单数学运算程序(不定期更新)
  • 三分钟教你同步 Visual Studio Code 设置
  • 详解移动APP与web APP的区别
  • Prometheus VS InfluxDB
  • 阿里云移动端播放器高级功能介绍
  • 进程与线程(三)——进程/线程间通信
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • # windows 安装 mysql 显示 no packages found 解决方法
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (16)Reactor的测试——响应式Spring的道法术器
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (7)STL算法之交换赋值
  • (arch)linux 转换文件编码格式
  • (三)Kafka 监控之 Streams 监控(Streams Monitoring)和其他
  • (四)stm32之通信协议
  • (四)库存超卖案例实战——优化redis分布式锁
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .bat批处理(六):替换字符串中匹配的子串
  • .bat批处理出现中文乱码的情况
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .Net Core与存储过程(一)
  • .NET delegate 委托 、 Event 事件