0-1背包问题

原创 2018年04月17日 20:51:29

递归暴力搜索
#include <iostream>
#define MAX 10000
using namespace std; 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
typedef pair<int,int> p;
int n,W;
p A[MAX];
int ret(int i,int j);
int main(int argc, char** argv) 
{
	cin>>n>>W;
	for(int i=0;i<n;i++)
	{
		int w,v;
		cin>>w>>v;
		A[i].first=w;
		A[i].second=v;
	}
	cout<<ret(0,W);
	return 0;
}
int ret(int i,int j)
{
	int res;
	if(i==n)
	{
		res=0; 
	}
	else if(j<A[i].first) 
	{
		res=ret(i+1,j);
	}
	else
	{
		res=max(ret(i+1,j),ret(i+1,j-A[i].first)+A[i].second);
	}
	return res;
	
} 

通过记忆化搜索可以将复杂度减到O(n*W)
#include <iostream>
#define MAX 10000
using namespace std; 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
typedef pair<int,int> p;
int n,W;
p A[MAX];
int ret(int i,int j);
int dp[MAX][MAX];
int main(int argc, char** argv) 
{
	cin>>n>>W;
	for(int i=0;i<n;i++)
	{
		int w,v;
		cin>>w>>v;
		A[i].first=w;
		A[i].second=v;
	}
	cout<<ret(0,W);
	return 0;
}
int ret(int i,int j)
{
	if(dp[i][j]>0)
	{
		return dp[i][j];
	}
	int res;
	if(i==n)
	{
		res=0; 
	}
	else if(j<A[i].first) 
	{
		res=ret(i+1,j);
	}
	else
	{
		res=max(ret(i+1,j),ret(i+1,j-A[i].first)+A[i].second);
	}
	return dp[i][j]=res;
	
} 

dp[i][j]:=从第i个数开始选,还能装的重量为j
dp[i][j]=max(dp[i+1][j],dp[i+1][j-w[i]+v[i])
#include <iostream>
#define MAX 10000
using namespace std; 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
typedef pair<int,int> p;
int n,W;
p A[MAX];
int ret(int i,int j);
int dp[MAX][MAX];
void solve();
int main(int argc, char** argv) 
{
	cin>>n>>W;
	for(int i=0;i<n;i++)
	{
		int w,v;
		cin>>w>>v;
		A[i].first=w;
		A[i].second=v;
	}
	solve();
	cout<<dp[0][W];
	return 0;
}
void solve()
{
	for(int i=n-1;i>=0;i--)
	{
		for(int j=0;j<=W;j++)
		{
			if(j<A[i].first)
			{
				dp[i][j]=dp[i+1][j];
			}
			else
			{
				dp[i][j]=max(dp[i+1][j],dp[i+1][j-A[i].first]+A[i].second);
			}
		}
	}
}

算法设计0-1背包问题

  • 2010年04月10日 21:53
  • 542B
  • 下载

0-1背包问题 动态规划源码

  • 2008年08月20日 23:06
  • 250KB
  • 下载

算法——贪心算法解0-1背包问题

问题的描述我们先根据一个贪心算法的经典应用实例,然后给出贪心算法的实现步骤与关键环节,最后给出C++代码求解0-1背包问题。 背包问题(Knapsack Problem):有NN件物品有一个承重(...
  • lanchunhui
  • lanchunhui
  • 2015-11-21 10:57:27
  • 1628

0-1背包问题分析及代码实现

0-1背包问题 动态数组申请
  • chen372901
  • chen372901
  • 2016-08-30 21:39:20
  • 801

动态规划之详细分析0-1背包问题

题目:   有 N 件物品和一个容量为 V 的背包。第 i 件物品的费用是 w[i],价值是 p[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。   本文按照动态规...
  • Hearthougan
  • Hearthougan
  • 2016-12-26 01:50:32
  • 5602

0-1背包问题的两种动态规划算法思想

动态规划有两种基本思路,一种是自顶而下的备忘录算法,一种思路是自底向上的动态规划算法。...
  • QiaoRuoZhuo
  • QiaoRuoZhuo
  • 2017-03-22 08:52:33
  • 1849

Java实现0-1背包问题

【作者:孟祥月  博客:http://blog.csdn.net/mengxiangyue】 首先简单的介绍一下0-1背包问题:有一个背包,有一定的容量,有几件物品,物品有重量和价值,选择物品放到背...
  • mengxiangyue
  • mengxiangyue
  • 2011-11-29 21:12:26
  • 8076

算法java实现--回溯法--0-1背包问题

0-1背包问题的java实现(回溯法) 具体问题描述以及C/C++实现参见网址 http://blog.csdn.net/liufeng_king/article/details/8764319...
  • qipanliming
  • qipanliming
  • 2014-05-18 17:52:58
  • 2854

通俗理解0-1背包问题解法

0-1背包问题是一个很经典的问题,使用动态规划算法来求解也是很经典的。下面我用一个例子来讲解用动态规划算法求解0-1背包问题。 假设商店中有5件东西,重量用w表示,价格用v表示 ...
  • liu_c_y
  • liu_c_y
  • 2016-11-19 23:19:35
  • 413

算法java实现--动态规划--0-1背包问题

0-1背包问题算法的java实现(动态规划法) 具体问题描述以及C/C++实现参见网址 http://blog.csdn.net/liufeng_king/article/details/...
  • qipanliming
  • qipanliming
  • 2014-04-27 22:11:05
  • 3298
收藏助手
不良信息举报
您举报文章:0-1背包问题
举报原因:
原因补充:

(最多只允许输入30个字)