背包问题(待补充)

0-1背包

【动态规划】讲解

#include<iostream.h>

void main()
{
	int capacity = 10;  //容量
	int w[6] = {0,2,2,6,5,4};  //重量
	int v[6] = {0,6,3,5,4,6};  //价值
	int p[6][11];  //背包
	int i,j;
	//初始化为0
	i=0;
	for(j=0;j<11;j++)
		p[i][j] = 0;
	j=0;
	for(i=0;i<6;i++)
		p[i][j] = 0;
	//对待物品的三种情况
	for(i=1;i<6;i++)
	{
		for(j=1;j<11;j++)
		{
			int num1 = p[i-1][j-w[i]]+v[i];
			int num2 = p[i-1][j];
			if(j<w[i])  //放不下
				p[i][j] = p[i-1][j];
			else if(num1 > num2)  //放
				p[i][j] = num1;
			else  //不放
				p[i][j] = num2;
		}
	}
	cout<<"最大价值为:"<<p[5][10]<<endl;

	int flag[5] = {0,0,0,0,0};  //是否装入背包中
	int tem = capacity;
	cout<<"放到背包的号码:";
	for(int t=5;t>0;t--)
	{
		if(p[t-1][tem-w[t]]+v[t] > p[t-1][tem])
		{
			cout<<t<<"号 ";
			tem = tem-w[t];
		}
	}
	cout<<endl; 
}

【回溯法】讲解

#include<iostream>
using namespace std;
int n = 5;  //
int capacity = 10;  //
int wei[5] = {2,2,6,5,4};  //
int val[5] = {6,3,5,4,6};  //
int x[5];  //
int res[5];  //
int bestp = 0;  //

//
void bug(int i,int weight,int cp,int rp)
{
	if(i>=n)
	{
		if(bestp<cp)
		{
			bestp = cp;
			for(int j=0;j<n;j++)
				res[j] = x[j];
		}
		return;
	}
	else
	{
		//遍历左子树
		if(weight >= wei[i])
		{
			x[i] = 1;
			cp = cp+val[i];
			rp = rp-val[i];
			bug(i+1,weight-wei[i],cp,rp);
			//回溯
			cp = cp - val[i];
			rp = rp + val[i];
		}
		//遍历右子树
		if(cp+rp-val[i] > bestp)
		{
			x[i] = 0;
			rp = rp-val[i];
			bug(i+1,weight,cp,rp);
		}
		return;
	}
}

int main()
{
	int cp = 0;  //
	int rp = 24;  //

	int weight = capacity;  //
	bug(0,weight,cp,rp);
	cout<<"装入背包的是:"<<endl;
	for(int i=0;i<n;i++)
	{
		if(res[i]==1)
			cout<<i+1<<endl;
	}
	cout<<"背包内物品总价值是:"<<bestp<<endl;
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值