背包问题之6
来源:互联网 发布:三星ssd数据迁移 编辑:程序博客网 时间:2024/05/13 05:23
背包问题之5中的算法只给出了最大利润的值,而没有给出最大利润下,背包所装物品的方案。下面除了通过回溯算法改进上一个算法的效率,还实现了给出背包所装物品方案的功能。
算法思想:
为找到最大的获利情况,先用最简单的蛮力算法回溯法来解决这个问题。不同于递归算法,递归算法是找大规模问题与小规模问题的关系,回溯法是对问题解空间进行搜索的算法。
C++代码:
#include <iostream>#include <vector>using namespace std;vector<int> v, p;//背包的总重量mint m;//n为物品的总件数int n;//n件物品的取舍情况vector<int> x, x_temp;//最大利润int best = 0;//当前背包的重量int total = 0;//此函数返回背包容量为m,k为当前处理的物品编号,v[i]表示第i+1件物品的重量,p[i]表示第i+1件物品的利润void fun(int k){ //如果遍历完n件物品 if (k == n) { int best_t = 0; for (int j=0;j<n;++j) { best_t += x_temp[j] * p[j]; } if (best_t > best) { x = x_temp; best = best_t; } return; } //不放第k件物品 x_temp[k] = 0; fun(k+1); //放第k件物品 if (total + v[k] <= m) { x_temp[k] = 1; total += v[k]; fun(k+1); total -= v[k]; }}int main(){ cout<<"请输入背包的总重量:"; cin>>m; cout<<"请分别输入所有物品的重量与利润:"<<endl; int wt, pt; while( cin>>wt>>pt ) { v.push_back(wt); p.push_back(pt); x.push_back(0); x_temp.push_back(0); ++n; } fun(0); cout<<"最大利润为:"<<best<<endl; for (int i=0;i<n;++i) { if (x[i] == 1) { cout<<"放第"<<i+1<<"件物品."<<endl; } } return 0;}// 5 // 2 5// 3 4// 4 7
运行结果:
0 0
- 背包问题之6
- 背包问题之01背包
- 背包问题之01背包
- 背包问题之01背包
- 背包问题之01背包、完全背包和多重背包
- 背包问题之01背包问题
- dp之背包问题
- 贪心之背包问题
- 背包问题之1
- 背包问题之2
- 背包问题之3
- 背包问题之4
- 背包问题之5
- 蛮力法之背包问题
- 贪心之背包问题
- 背包问题之0-1背包(一)
- 背包问题之0-1背包(二)
- 背包问题之0-1背包(三)
- Servlet
- Qt发布可能遇到的问题
- 15. 3Sum 和 18. 4Sum
- 网络革命:软件定义网络与网络虚拟化
- cocos2d-x·技巧]关于cocos2d-x在Android下实现单点触摸小技巧
- 背包问题之6
- socket简单整理
- uva 11729 —— Commando War
- uva 12124 —— Assemble
- uva 12097—— Pie
- uva 11292 ——The Dragon of Loowater
- UVALive - 3905 —— Meteor 流星
- UVALive - 3882 —— And Then There Was One
- UVA - 10635 —— Prince and Princess