0/1背包问题

问题描述:给定N个物品,每个物品有一个重量W和一个价值V.你有一个能装C重量的背包.问怎么装使得所装价值最大.每个物品只有一个.

参考文档:https://blog.csdn.net/liuxiao214/article/details/78565707 

 

1. 数组长度==物品数量+1

#include   
#include 
#include 
#include  
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;


int main(void)
{
	const int N = 5; //物体数目
	
	//注意val和wei长度为6.要在下标为0处加入一个数,否则后面数组越界
	vector val{0, 6, 3, 5, 4, 6 }; //物体价值
	vector wei{0, 2, 2, 6, 5, 4 }; //物体重量
	const int cap = 10; //背包容量

	//dp共(N+1)行,(cap+1)列
	//dp[0][j] = 0,这个意思是说,当没有物品放入时,不管背包容量多少,其最大价值为0;
	//dp[i][0] = 0,当背包容量为空时,不管从前i件物品中怎么取,最大价值也还是0。
	//dp[i][j]表示物品1~i,在重量不超过j的情况下可以达到的最大价值
	vector> dp(N+1, vector(cap+1, 0)); 
	//此时已初始化边界条件,dp(0, j) = dp(i, 0) = 0

	for (int i = 1; i <= N; i++)
	{
		for (int j = 1; j <= cap; j++)
		{
			if (wei[i] > j) //第i个物体放不进去
				dp[i][j] = dp[i - 1][j];
			else //第i个物体可以放进去,取以下两种情况较大者:1.不放i物体 2.放置i物体
				dp[i][j] = std::max(dp[i-1][j], dp[i-1][j-wei[i]] + val[i]);
		}
	}



	for (int i = 1; i <= N; i++)
	{
		for (int j = 1; j <= cap; j++)
			printf("dp[%d][%d] = %d\t", i, j, dp[i][j]);
		cout << endl;
	}

	return 0;
}

 2.数组长度==物品数量

#include   
#include 
#include 
#include  
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;


int main(void)
{
	const int N = 5; //物体数目
	
	vector val{6, 3, 5, 4, 6 }; //物体价值
	vector wei{2, 2, 6, 5, 4 }; //物体重量
	const int cap = 10; //背包容量

	//dp共N行,(cap+1)列
	//dp[i][0] = 0,当背包容量为空时,不管从前i件物品中怎么取,最大价值也还是0。
	//dp[i][j]表示物品0~i,在重量不超过j的情况下可以达到的最大价值
	vector> dp(N, vector(cap+1, 0)); 
	//此时已初始化边界条件,第一列dp(i, 0) = 0
	//下面初始化第一行
	for (int j = 0; j <= cap; j++)
	{
		if (j >= wei[0]) 
			dp[0][j] = val[0];
	}

	for (int i = 1; i < N; i++)
	{
		for (int j = 1; j <= cap; j++)
		{
			if (wei[i] > j) //第i个物体放不进去
				dp[i][j] = dp[i - 1][j];
			else //第i个物体可以放进去,取以下两种情况较大者:1.不放i物体 2.放置i物体
				dp[i][j] = std::max(dp[i-1][j], dp[i-1][j-wei[i]] + val[i]);
		}
	}



	for (int i = 0; i < N; i++)
	{
		for (int j = 1; j <= cap; j++)
			printf("dp[%d][%d] = %d\t", i, j, dp[i][j]);
		cout << endl;
	}

	return 0;
}

 

你可能感兴趣的:(C++)