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 1024


unsigned 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/285623.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

帅爆了!SylixOS 可视化内核监控器即将发布

在翼辉即将发布的 RealEvo 6.0 中&#xff0c;将会加入 SylixOS 可视化内核监控器功能组件。可视化内核监控器实现了线程和进程状态跟踪、中断测量、内存使用率统计、IO 系统分析等功能&#xff0c;可用于复杂场景下应用程序、系统内核、BSP 以及驱动程序的图形化分析&#xff…

本地部署生成式AI,选显卡or笔记本电脑?!新款酷睿Ultra举票

来源 | 算力豹 200亿个大模型参数无压力&#xff0c;新一代酷睿Ultra凭什么&#xff1f; 12月14日报道&#xff0c;在大模型军备竞赛如火如荼的今天&#xff0c;真正让AI铺开惠民&#xff0c;那么移动端、PC将成为首选&#xff0c;AI PC或成标配。英特尔今日奉上AI硬件大招&am…

Polygon zkEVM ROM Spearbit审计报告解读(2023年8月calldata bug修复)

1. 引言 前序博客有&#xff1a; Polygon zkEVM Hexens审计报告解读Polygon zkEVM Spearbit审计报告解读&#xff08;2022年12月版本&#xff09;Polygon zkEVM Spearbit审计报告解读&#xff08;2023年1月版本&#xff09;Polygon zkEVM Spearbit审计报告解读&#xff08;20…

一文初识Linux进程(超详细!)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;HEART BEAT—YOASOBI 2:20━━━━━━️&#x1f49f;──────── 5:35 &#x1f504; ◀️ ⏸ ▶️ ☰ …

2024年最火爆的前端技术:虚拟DOM让页面性能飞升!

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 前言 正文 &#x1f4d8; 一、什么是虚拟D…

红队攻防实战之DC2

吾愿效法古圣先贤&#xff0c;使成千上万的巧儿都能在21世纪的中华盛世里&#xff0c;丰衣足食&#xff0c;怡然自得 0x01 信息收集: 1.1 端口探测 使用nmap工具 可以发现开放了80端口&#xff0c;网页服务器但是可以看出做了域名解析&#xff0c;所以需要在本地完成本地域名…

LiveGBS流媒体平台GB/T28181功能-国标级联对接海康大华宇视华为等上级平台选择通道支持只看已选只看未选

LiveGBS功能国标级联对接海康大华宇视华为等上级平台选择通道支持只看已选只看未选 1、国标级联2、只看已选3、只看未选4、搭建GB28181视频直播平台 1、国标级联 LiveGBS可以作为下级平台&#xff0c;级联到第三方国标平台&#xff0c;详见&#xff1a; LiveGBS国标GB/T28181流…

Java智慧校园源码,SaaS云平台,私有云部署,移动端小程序使用小程序原生语言开发

系统概述&#xff1a; 电子班牌系统又称之为智慧班牌&#xff0c;是当前校园数字化信息化建设、文化建设的主流&#xff0c;是校园日常工作安排、校园信息发布、班级文化风采展示、课堂交流的重要应用载体。智慧班牌系统在传统信息发布和校园文化展示功能基础上&#xff0c;融…

白话机器学习的数学-2-分类

1、设置问题 图片分类&#xff1a;只根据尺寸把它分类为 纵向图像和横向图像。 如果只用一条线将图中白色的点和黑色的点分开&#xff1a; 这次分类的目的就是找到这条线。 2、内积 找到一条线&#xff0c;这是否意味着我们要像学习回归时那样&#xff0c;求出一次函数的斜率…

uni-app 前后端调用实例 基于Springboot 数据列表显示实现

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

人工智能_机器学习085_DBSCAN算法介绍_具有噪声基于密度的聚类_基于密度的空间聚类方法---人工智能工作笔记0125

然后我们再来看一种聚类算法,叫做DBSCAN算法 可以看到,他和KMeans的原理完全不一样, 这个是基于密度的聚类方法,就是在一堆数据中,把密度最大的数据,归为一类 这里的划分为簇,其实就是 划分类别的意思 这个簇,就跟鱼群一样,一个鱼群中肯定是同一种鱼类. 然后我们再来看,DBSC…

LeetCode刷题--- 第 N 个泰波那契数

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述动…

从马尔可夫奖励过程到马尔可夫决策到强化学习【01/2】

一、说明 关于马尔可夫过程&#xff0c;如何将马尔可夫决策转化成决策依据&#xff0c;这里介绍的基本的思想路径&#xff0c;为读者将来设计和应用决策模型提供理论上的参考。 这是了解强化学习的一系列基础文章的后续文章。如果您有兴趣了解强化学习&#xff0c;请查看此处。…

设计模式之工厂设计模式【创造者模式】

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

苹果手机录音误删怎么恢复?记住这3个正确操作方法!

苹果语音备忘录被广泛应用于生活、工作和学习等各个方面。通过语音备忘录&#xff0c;我们可以记录重要的会议、对话、音乐或声音。 但如果不小心删除了这些珍贵的录音文件&#xff0c;该怎么办呢&#xff1f;苹果手机录音误删怎么恢复&#xff1f;本文将为你提供三个常用的解…

【计算机毕业设计】SSM汽车维修预约平台

项目介绍 本项目分为前后台&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员角色&#xff1a; 管理员登录,新增管理员信息,查看管理员信息,查询管理员信息,查看用户信息列表,查询用户信息,新增新闻公告,查看新闻公告,查询新闻公告,新增配件类…

分布式系统架构设计之分布式数据存储的安全隐私和性能优化

五、安全性和隐私 在前面分布式系统部分&#xff0c;有对安全性做过介绍&#xff0c;如前面所述&#xff0c;在分布式系统中&#xff0c;确保系统的安全性和隐私是至关重要的。安全性关注系统的防护措施&#xff0c;而隐私是关注用户的个人信息保护。 安全性 身份认证&#…

【后端已完成,前端更新ing】uniapp+springboot实现个人备忘录系统【前后端分离】

目录 &#xff08;1&#xff09;项目可行性分析 &#xff08;一&#xff09;技术可行性&#xff1a; &#xff08;二&#xff09;经济可行性&#xff1a; &#xff08;三&#xff09;社会可行性&#xff1a; &#xff08;2&#xff09;需求描述 功能模块图 用例图&#…

航芯ACM32G103开发板评测 03 RT-Thread Nano移植 线程管理测试

航芯ACM32G103开发板评测 07 RT-Thread Nano移植 线程管理测试 1. 软硬件平台 ACM32G103 Board开发板MDK-ARM KeilRT-Thread Nano 源码 2. 物联网RTOS—RT-Thread ​ RT-Thread诞生于2006年&#xff0c;是一款以开源、中立、社区化发展起来的物联网操作系统。 RT-Thread主…

我的2023年度总结:从大学生到程序员的转变

在过去的一年里&#xff0c;我从一名大学生转变为一名计算机专业人士&#xff0c;经历了许多实战经历&#xff0c;其中最让我印象深刻的是我参与的一个校园App项目。在这个项目中&#xff0c;我负责后端开发和数据库设计&#xff0c;成功地将App上线并得到了师生的好评。 在技术…