首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

回溯算法求解0-1背包问题时的剪枝方案

直接上代码:

1、左边界剪枝,排序商品。理解不是排列是组合。

2、右边界剪枝,找到一种选择,其它子节点不再访问。

//万能头文件#include <bits/stdc++.h>#include <algorithm> //算法库 ACM using namespace std;//背包容器int wei=50;struct Good { int w; int v; int isSel;};Good goods[3];int res[100]= {-1};

void init() { //不是排列是组合 goods[0]= {10,20,0}; goods[1]= {20,15,0}; goods[2]= {40,10,0};}

void show(int n) { cout<<"--------------------------"<<endl; for(int i=1; i<=n; i++) { cout<< goods[ res[i] ].w <<"-"<<goods[ res[i] ].v <<endl; } cout<<"*******************"<<endl;}int maxVal=0; int ans=0;void dfs(int idx,int wei,int dept,int sum) {//idx 用于左边界剪枝 for(int i=idx; i<3 ; i++ ) { if( goods[i].isSel==1 )continue; //可选择 goods[i].isSel=1; res[dept]=i; //是否选择 if(wei- goods[i].w ==0) { cout<<sum+goods[i].v<<endl; ans=max(ans,sum+goods[i].v); show(dept);break;//右边界剪枝 } else if( wei- goods[i].w <0 ) { //选择结束 cout<<sum<<endl; ans=max(ans,sum); show(dept-1); break;//右边界剪枝 } else { //继续选择 dfs(i+1,wei- goods[i].w,dept+1,sum+goods[i].v); } goods[i].isSel=0; res[dept]=-1; }}int main() { init(); dfs(0,wei,1,0); cout<<"-----------"<<endl; cout<<ans; return 0;}

  • 发表于:
  • 原文链接https://page.om.qq.com/page/Ol6ywz8yCXKFFPImy8KYIO_w0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

相关快讯

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券