0-1背包问题(递归实现)

</pre><pre class="cpp" name="code"><span style="font-size:14px;">#include<iostream>
#include<vector>
#include<iterator>
#include<algorithm>
#include<string>
using namespace std;

/*
*0-1背包问题(递归实现)
*/
//int * * values;//values[i][j]表示在前i个物品中能够装入容量为j的背包中的物品的最大值  (二维数组方案一)
vector<vector<int>> values;//values[i][j]表示在前i个物品中能够装入容量为j的背包中的物品的最大值   (二维数组方案二)

int knapsack(vector<int>& w,vector<int>& v,int i,int vol)
{
	if(i==0||vol==0)
		return values[i][vol] = 0;
	if(vol<w[i])
	{
		return values[i][vol] = knapsack(w,v,i-1,vol);
	}
	if(vol>=w[i])
	{
		int fi = knapsack(w,v,i-1,vol);
		int se = knapsack(w,v,i-1,vol-w[i])+v[i];
		return values[i][vol] = max(fi,se);
	}
}

void PrintRes(vector<int>& w,int i,int vol)
{
	if(i<=0)
		return ;
	if(values[i][vol]>values[i-1][vol])
	{
	  PrintRes(w,i-1,vol-w[i]);
	  cout<<i<<"   ";
	}
	else
	{
		PrintRes(w,i-1,vol);
	}
}
int main()
{
	vector<int> w;//物品的重量
	vector<int> v;//物品的价值
	int vol;
	w.push_back(0);//
	v.push_back(0);//
	copy(istream_iterator<int>(cin),istream_iterator<int>(),back_inserter(w));
	cin.clear();
	cin.sync();
	copy(istream_iterator<int>(cin),istream_iterator<int>(),back_inserter(v));
	cin.clear();
	cin.sync();
	cin>>vol;

	//创建和初始化v数组
	/*values = new int*[w.size()];    (二维数组方案一)
	for (int i = 0; i < w.size(); i++)
	{
		values[i] = new int[vol+1];
	}*/
	//(二维数组方案er)
	values = vector<vector<int>>(w.size(),vector<int>(vol+1));
	//运行查找解决方案的函数
	knapsack(w,v,w.size()-1,vol);
	//输出0-1背包结果</span><span style="font-size:14px;">
	PrintRes(w,w.size()-1,vol);</span><span style="font-size:14px;">
}</span>

输入示例:

第一行输入各个物品的重量

第二行输入各个物品的价值

第三行输入背包的最大承受重量

时间: 2024-12-28 20:31:22

0-1背包问题(递归实现)的相关文章

0/1背包问题(回溯法)

回溯法是一个既带有系统性又带有跳跃性的搜索算法.它在包含问题的所有解的解空间树中,按深度优先策略,从根结点出发搜索解空间树.算法搜索至解空间树的任意一结点时,先判断该结点是否包含问题的解.如果肯定不包含,则跳过对该结点为根的子树搜索,逐层向其祖先结点回溯:否则 ,进入该子树,继续按深度优先策略搜索. 问题的解空间 用回溯法解问题时,应明确定义问题的解空间.问题的解空间至少包含问题的一个(最优)解.对于 n=3 时的 0/1 背包问题,可用一棵完全二叉树表示解空间,如图所示: 求解步骤 1)针对所

0/1背包问题的动态规划法求解 —— Java 实现

0/1背包问题的动态规划法求解,前人之述备矣,这里所做的工作,不过是自己根据理解实现了一遍,主要目的还是锻炼思维和编程能力,同时,也是为了增进对动态规划法机制的理解和掌握. 值得提及的一个问题是,在用 JAVA 实现时, 是按算法模型建模,还是用对象模型建模呢? 如果用算法模型,那么 背包的值.重量就直接存入二个数组里:如果用对象模型,则要对背包以及背包问题进行对象建模.思来想去,还是采用了对象模型,尽管心里感觉算法模型似乎更好一些.有时确实就是这样,对象模型虽然现在很主流,但也不是万能的,采用

编程算法 - 背包问题(递归) 代码(C)

背包问题(递归) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有n个重量和价值分别为w,v的物品, 从这些物品中挑选出总重量不超过W的物品, 求所有挑选方案中价值总和的最大值. 即经典动态规划问题. 可以使用深度优先搜索, 把每个部分都遍历到, 选取最优解, 但不是最好的方法. 代码: /* * main.cpp * * Created on: 2014.7.17 * Author: spike */ /*eclipse cdt, gc

动态规划算法求解0,1背包问题

首先我们来看看动态规划的四个步骤: 1. 找出最优解的性质,并且刻画其结构特性: 2. 递归的定义最优解: 3. 以自底向上的方式刻画最优值: 4. 根据计算最优值时候得到的信息,构造最优解 其中改进的动态规划算法:备忘录法,是以自顶向下的方式刻画最优值,对于动态规划方法和备忘录方法,两者的使用情况如下: 一般来讲,当一个问题的所有子问题都至少要解一次时,使用动态规划算法比使用备忘录方法好.此时,动态规划算法没有任何多余的计算.同时,对于许多问题,常常可以利用其规则的表格存取方式,减少动态规划算

背包问题:0/1背包问题 普通背包问题(贪心算法只适用于普通背包问题)

//sj和vj分别为第j项物品的体积和价值,W是总体积限制. //V[i,j]表示从前i项{u1,u2,…,un}中取出来的装入体积为j的背包的物品的最大价值. 第一种:0/1背包问题 最大化 ,受限于  1)若i=0或j=0,  V[i,j] = 0 2)若j<si, V[i,j] = V[i-1,j] 3)若i>0且j>=si, V[i,j] = Max{V[i-1,j],V[i-1,j-si]+vi} 第二种:背包问题:在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部

动态规划算法实现部分——0/1背包问题

代码: import java.util.*; import java.util.Scanner; /* *动态规划思想解决0/1背包问题 */ public class Main{ public static void main(String[] args){ Scanner in=new Scanner(System.in); System.out.println("输入背包的容量"); int bagCap=in.nextInt(); //背包的容量 System.out.pri

第十六章 贪心算法——0/1背包问题

1.问题描述: 给定n种物品和一背包.物品i的重量是wi,其价值为vi,背包的容量为C.问:应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 形式化描述:给定c >0, wi >0, vi >0 , 1≤i≤n.要求找一n元向量(x1,x2,…,xn,), xi∈{0,1}, ∋ ∑ wi xi≤c,且∑ vi xi达最大.即一个特殊的整数规划问题. 2.最优性原理: 设(y1,y2,…,yn)是 (3.4.1)的一个最优解.则(y2,…,yn)是下面相应子问题的一个最优解:

0 1背包问题 (内有题目列表)

问题描述:一个背包可承重W,现有n件东西,东西 i 的价值为 vi,重量为wi.现在从这n件东西中拿出几件装到背包中,问可获得的最大价值? 举例:W = 3, n = 3; 东西的价值 vi wi3 4 4 5 5 6 DP的解法: 先从递归的角度理解这个问题,然后在贴上非递归的模板. 现在为东西编号:0 1 2 3 …n-1:我们先从n-1开始(其实从哪一端开始都无所谓,不要在意这些细节),我其实不觉得这个算法属于DP的,不管这个了. Make(i,j) = max{Make(i-1,j-w[

动态规划0—1背包问题

动态规划0-1背包问题 ? 问题描写叙述: 给定n种物品和一背包.物品i的重量是wi,其价值为vi,背包的容量为C.问应怎样选择装入背包的物品,使得装 入背包中物品的总价值最大? ? 对于一种物品,要么装入背包,要么不装.所以对于一种物品的装入状态能够取0和1.我们设物品i的装入状态为xi,xi∈ (0,1),此问题称为0-11背包问题. 过程分析 数据:物品个数n=5,物品重量w[n]={0,2,2,6,5,4},物品价值V[n]={0,6,3,5,4,6}, (第0位,置为0,不參与计算,仅

【算法设计与分析】7、0/1背包问题,动态规划

/** * 书本:<算法分析与设计> * 功能:给定n种物品和一个背包,物品i的重量是Wi, 其价值为Vi,问如何选择装入背包的物品,使得装入背包的物品的总价值最大? * 文件:beiBao.cpp * 时间:2014年11月30日19:22:47 * 作者:cutter_point */ #include <iostream> #define SIZEBEIBAO 20 using namespace std; //这个背包问题的最优的子结构是 /* 首先这里一共有m种物品,背包