0-1背包问题

动态规划

动态规划解决0-1背包问题首先要找到状态,以及状态转换函数。

if(j

//当j容量小于第i件物品(序号为i-1)重量时,那么装不进i,最大价值不变

else dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i-1]]+v[i-1]);

//反之,比较装i和不装i的价值,取最大值

开数组,本题中,开dp数组,记录前i件物品,j容量时的最大价值。然后写入初始条件,循环计算dp数组。然后根据每一次的决策,逆序顺藤摸瓜,将最大价值物品方案输出。最后返回最大价值dp[n][c]。

#include 
#include 
using namespace std;
int knapSack(int w[],int v[],int n,int c);
int main() {
	int n,c;//物品数量和容量 
	cout<<"请输入物品数量:"<>n;
	int w[n],v[n];//物品重量和物品价值数组 
	cout<<"请分别输入物品的重量:"<>w[i];
	}
	cout<<"请输入物品价值:"<>v[i];
	}
	cout<<"请输入背包容量:"<>c;
	cout<<"背包中客房下的物品的最大价值为:"<0; i--) {//顺藤摸瓜寻求物品序列 
		if(dp[i][j]>dp[i-1][j]) {
			things[i-1]=1;
			j=j-w[i-1];
		} else {
			things[i-1]=0;
		}
	}
	cout<<"最大价值物品解释(物品序号):"; 
	for(int i=0;i

 0-1背包问题_第1张图片

 

你可能感兴趣的:(数据结构与算法)