01背包问题实现源码

经典问题,物品个数为n,背包重量为v,则时间复杂度为O(nv)。

空间复杂度为O(v)。

不过如果要得到选择的最终结果,则需要把中间结果都记录下来,空间复杂度只能也用O(nv)。

#include <iostream>
using namespace std;

int max(int a,int b) {
	return a>=b ? a : b;
}

int bag_use_one_array (
		const int weight[], 
		const int value[], 
		const int item_size, 
		const int bag_weight) {

	int max_value[bag_weight+1];
	for (int i=0; i<=bag_weight; i++) {
		max_value[i] = 0;
	}

	for (int i=0; i<item_size; i++) {
		for (int w=bag_weight; w>=1; w--) {
			if (weight[i] <= w) {
				//max_value[w] = max(max_value[w], max_value[w-weight[i]]+value[i]);
				if ( max_value[w] >= max_value[w-weight[i]]+value[i]) {
				} else {
					max_value[w] = max_value[w-weight[i]]+value[i];
				}
				cout << "item:" << i << ",wight:" << w << ",max_value:" << max_value[w] << endl;
			}
		}
		cout << endl;
	}

	cout << "max value is : " << max_value[bag_weight] << endl;
	cout << endl;

	return max_value[bag_weight];
}

int bag_get_best_choice (
		const int weight[], 
		const int value[], 
		const int item_size, 
		const int bag_weight) {

	int max_value[bag_weight+1][item_size+1];
	for (int i=0; i<=bag_weight; i++) {
		max_value[i][0] = 0;
	}

	for (int j=0; j<=item_size; j++) {
		max_value[0][j] = 0;
	}

	for (int i=1; i<=item_size; i++) {
		for (int w=bag_weight; w>=1; w--) {
			if (weight[i-1] <= w) {
				if ( max_value[w][i-1] >= max_value[w-weight[i-1]][i-1]+value[i-1]) {
					max_value[w][i] = max_value[w][i-1];
				} else {
					max_value[w][i] = max_value[w-weight[i-1]][i-1]+value[i-1];
				}
			} else {
			    max_value[w][i] = max_value[w][i-1];
			}
			cout << "item:" << i << ",wight:" << w << ",max_value:" << max_value[w][i] << endl;
		}
		cout << endl;
	}

	cout << "max value is : " << max_value[bag_weight][item_size] << endl;
	cout << endl;

	int choice[item_size];
	int weight_choice = bag_weight;
	for (int i=item_size-1; i>=0; i--) {
		if (max_value[weight_choice][i+1] 
				> max_value[weight_choice][i]) {
		    choice[i]=1;
			weight_choice -= weight[i];
		} else {
		    choice[i]=0;
		}
	}

	for (int i=0; i<item_size; i++) {
		cout << choice[i] << " ";
	}
	cout << endl;

	return max_value[bag_weight][item_size];
}

int main() {
	const int item_size = 5;
	const int bag_weight = 15;

        int weight[item_size] = {12,1,4,1,2};
	int value[item_size] = {4,2,10,1,2};

	//bag_use_one_array(weight, value, item_size, bag_weight);
	bag_get_best_choice(weight, value, item_size, bag_weight);

	return 0;
}
时间: 2024-10-23 20:28:26

01背包问题实现源码的相关文章

01.备份crm源码

winrar的命令行参数: !winrar! a "!rarto!" "!from!" 压缩文件内的路径可以用 -ep , -ep1 等来指定,但是好像不好指定只包含文件所在文件夹, 大概是:-ep3 包括驱动器名;-ep2 不包括驱动器;测试ep ep1都是没有文件夹,直接就是文件; -------------------winrar.exe 参数 -AG[格式] : 给压缩包文件名指定时间串; (%date:~0,4%%date:~5,2%%date:~8,2%

Linux下源码安装CodeBlocks

Linux下源码安装CodeBlocks qianghaohao(CodingNutter) 一. 安装平台说明: CentOs6.4-i686  gcc-4.4.7 二. 下载最新源码: http://www.codeblocks.org/downloads 在此安装的是最新版:Code::Blocks 16.01 三. 阅读官方安装说明文档: http://wiki.codeblocks.org/index.php/Installing_Code::Blocks_from_source_on

PHP基于B/S模式下的学生选课管理系统、源码分享

大家好,我是全微毕设团队的创始人,本团队擅长JAVA(SSM,SSH,SPRINGBOOT).PYTHON.PHP.C#.安卓等多项技术. 今天将为大家分析一个学生选课管理系统,本系统采用目前最流行的B/S结构和myeclipse编辑器.PHP开发语言,MySQL数据库设计并实现的. 随着教育规模的不断壮大,信息变得越来越多.同时计算机网络技术高速发展,网络管理运用也变得越来越广泛.因此,建立一个B/S结构的学生选课管理系统来管理学校信息,会使管理工作系统化.规范化,也会提高学校形象,提高管理效

FatFsVersion0.01源码分析

目录 一.API的函数功能简述 二.FATFS主要数据结构 1.FAT32文件系统的结构 2.FATFS主要数据结构 ①   FATFS ②   DIR ③  FIL ④  FILINFO ⑤  win[512] ⑥  buffer 三.函数功能与实现详细分析  0.move_window  1.f_mountdrv  2.f_open 3.f_read 4.f_write 5.f_sync 6.f_opendir 7.f_mkdir 8.f_unlink 9.f_lseek 10.f_read

UCanCode发布升级E-Form++可视化源码组件库2015全新版 (V23.01)!

2015年4月. 成都 UCanCode发布升级E-Form++可视化源码组件库2015全新版 (V23.01)! --- 全面性能提升,UCanCode有史以来最强大的版本发布! E-Form++可视化源码组件库企业版本2015最新版发布!(超过50万行VC++源代码,历时14年开发,价值数百万,100% VC++ Source Code提供)!("The only Flow/Diagramming Kits that provides full source code of componen

【iScroll源码学习01】准备阶段 - 叶小钗

[iScroll源码学习01]准备阶段 - 叶小钗 时间 2013-12-29 18:41:00 博客园-原创精华区 原文  http://www.cnblogs.com/yexiaochai/p/3496369.html 主题 iScroll HTML JavaScript ① viewport相关知识点(device-width等) ②  CSS3硬件加速 ③ 如何暂停CSS动画 ④ e.preventDefault导致文本不能获取焦点解决方案 ...... 当然,我们写的demo自然不能和

jQuery 源码学习 - 01 - 简洁的 $(&#39;...&#39;)

首先贴上学习参考资料:[深入浅出jQuery]源码浅析--整体架构,备用地址:chokcoco/jQuery-. jQuery 库,js 开发的一个里程碑,它的出现,让网页开发者们告别荒蛮的上古时代,初步解放生产力,正式进入黄铜时代. 虽然如今 Angular/React/Vue 三驾马车驰骋畋猎,jQuery的时代渐行渐远,但是它的思想它的设计都有着里程碑式的作用.当然,我是拿它来补基础的,逃... 1.自执行函数 (function(params) { // ... })(Variable)

01 flask源码剖析之werkzurg 了解wsgi

目录 01 werkzurg了解wsgi 1. wsgi 2. flask之werkzurg源码流程 3. 总结 01 werkzurg了解wsgi 1. wsgi django和flask内部都没有实现socket,而是wsgi实现. wsgi是web服务网关接口,他是一个协议,实现它的协议的有:wsgiref/werkzurg/uwsgi django之前 from wsgiref.simple_server import make_server def run(environ, start

prototype.js 源码解读(01)

prototype.js是一个设计的非常优雅且很有实用价值的js基础类库,其源码非常值得研究.研究它的源码不仅能提升个人水平,而且对你打下坚实的js基础也很有帮助.因本人技术水平有限,该解读仅供参考. 定义全局对象Prototype,包括属性版本号,属性版本号的定义有利于版本号的检测 9 var Prototype = { 10 Version: '1.5.0', 11 BrowserFeatures: { 12 XPath: !!document.evaluate 13 }, 14 15 Sc