0/1背包问题-动态规划法

33 篇文章 1 订阅
6 篇文章 0 订阅

算法实现
设n个物品的重量存储在数组w[n]中,价值存储在数组v[n]中,背包容量为C,数组V[n+1][C+1]存放迭代结果,
其中V[i][j]表示前i个物品装入容量为j的背包中获得的最大价值,数组x[n]存储装入背包的物品,动态规划法求解0/1背包问题的算法如下:
在这里插入图片描述

#include <iostream>
using namespace std;
int V[6][7];
int x[5];
#define C 6
int Max(int x,int y);
int KnapSack(int w[],int v[],int n){
	int i,j;
	for(i=0;i<=n;i++)
	{
		V[i][0]=0;
	}
	for(j=0;j<=C;j++)
	{
		V[0][j]=0;
	}
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=C;j++)
		{
			
			if(j<w[i])
				V[i][j]=V[i-1][j];
			else
				V[i][j]=Max(V[i-1][j],V[i-1][j-w[i]]+v[i]);
		}
	}
	for (j=C,i=n;i>0;i--)                 //回溯,求装入背包的物品
	{	
		if (V[i][j]>V[i-1][j]) 
		{
			x[i]=1;
			j=j-w[i];
		}
		else x[i] = 0;
	}	
	
	return V[n][C];
}

int Max(int x,int y){
	if(x>y)
		return x;
	else
		return y;
}

int main(){
	int w[]={-1,3,2,1,4,5};
	int v[]={-1,25,20,15,40,50};
	int x1=KnapSack(w,v,5);
	cout<<"背包获得的最大价值是:"<<x1<<endl;
	cout<<"装入背包的物品是:";
	for(int i=1;i<=5;i++)
		if (x[i]==1) cout<<"物品"<<i<<"  ";	
		return 0;
}

时间复杂度:O(n*C)
运行结果:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值