给定背包的载重量M=20,有6个物体,价值分别为11,8,15,18,12,6,重量分别为5,3,2,10,4,2。利用回溯法求解上述问题。
一、 算法思想描述
对每个结点考虑两种情况——放入和没放入,每个分支开始时计算该分支可能达到的最大上界,如果小于当前已经能达到的上界,则不继续计算该分支,否则深入计算,直到找到最优解为止。
二、 完整的程序以及说明
- #include<iostream>
- #include<algorithm>
- using namespace std;
- // 物体结构体
- typedef struct{
- float w;
- float p;
- float v;
- int id;
- }OBJECT;
- bool cmp(OBJECT a, OBJECT b){
- return a.v>b.v;
- }
- float knapsack_back(OBJECT ob[], float M, int n, bool x[]){
- int i,k;
- float w_cur, p_total, p_cur, w_est, p_est;
- bool *y = new bo