前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >回溯法(dfs)解决0-1背包问题

回溯法(dfs)解决0-1背包问题

作者头像
AI那点小事
发布2020-04-18 00:38:12
6830
发布2020-04-18 00:38:12
举报
文章被收录于专栏:AI那点小事AI那点小事

代码

#include<iostream>
using namespace std;

int Capacity;				//背包容量 
bool selected[10000];		//当前选择方案 
bool optimal[10000];		//最佳选择方案 
int maxTotalValue = 0;		//最大价值 
int valueofPackage = 0;		//当前背包价值
int residualCapacity;		//剩余背包价值
int n;
int weight[10000];			//背包重量 
int value[10000];			//背包价值 

void dfs(int i)
{
	if(i > n){
		if(valueofPackage >= maxTotalValue){
			for(int i = 1 ; i <= n ; i++){
				optimal[i] = selected[i];
			}
			maxTotalValue = valueofPackage;
		}
		return;
	}else{
		residualCapacity -= weight[i];
		if(residualCapacity >= 0){	//遍历左子树 
			selected[i] = 1;
			valueofPackage += value[i];
			dfs(i+1);
			selected[i] = 0;
			valueofPackage -= value[i];
			residualCapacity += weight[i];
		}else{//不满足原路返回 
			residualCapacity += weight[i];
		}
	}
	//遍历右子树
	dfs(i+1); 
}


int main(){
	cout<<"输入背包容量:"<<endl;
	cin>>Capacity;
	residualCapacity = Capacity; 
	cout<<"请输入背包个数:"<<endl;
	cin>>n;
	cout<<"请输入每个背包重量:"<<endl;
	for(int i = 1 ; i <= n ; i++){
		cin>>weight[i];
	}
	cout<<"请输入每个背包价值:"<<endl;
	for(int i = 1 ; i <= n ; i++){
		cin>>value[i];
	} 
	dfs(1);
	cout<<"最佳方案为:"<<endl;
	for(int i = 1 ; i <= n ; i++){
		if(optimal[i] == 1){
			cout<<i<<" "; 
		}
	}
	cout<<endl<<"最大背包价值为:"<<endl<<maxTotalValue;
	
	return 0;
}

截图

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代码
  • 截图
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档