您的位置:首页 > 编程语言

las和回溯结合的解01背包的代码

2013-06-29 20:02 113 查看


#include<iostream>
#include<fstream>
#include<vector>
#include<string>
#include<bitset>
#include<algorithm>
#include<ctime>
using namespace std;

const int N=50;//the number of the item
const int max_w=1000;//max weight
int best_solution=0;
bitset<N> b;
vector<int> v,v_best;
vector<int> w;

int lcw=0; // be used to translate the weight from las to trace
int lcv=0;

int final_v=0;

void las_packing(int);
void trace_back(int,int,int);

int
main(){
    v.reserve(N);
    v_best.reserve(N);
    w.reserve(N);

    cout<<"input the weight and value of each item";
    freopen("test.txt","r",stdin);
    for(int i=0;i<N;i++){
        int x=0;
        int y=0;
        cin>>x;
        v.push_back(x);
        cin>>y;
        w.push_back(y);
    }

    cout<<"done"<<endl;
    for(int i=0;i<10;i++){
        las_packing(30);
        trace_back(31,lcw,lcv);
        if(best_solution>final_v)
          final_v = best_solution;
        lcw=0;
        lcv=0;
    }

    cout<<final_v<<endl;
}

void trace_back(int i,int cw, int cv){
    int j;
    if(i>=N){
        if(cv>best_solution)
        {
            best_solution=cv;
            v_best.assign(v.begin(),v.end());
        }
    }
    else{
        for(j=0;j<=1;j++){
            b.flip(i);
            if( cw + (int)b[i] * w[i] <= max_w){
                cw += w[i]*(int)b[i];
                cv += v[i]*(int)b[i];
                trace_back(i+1,cv,cw);
                cw -= w[i]*(int)b[i];
                cv -= v[i]*(int)b[i];
            }
        }
    }
}

void las_packing(int n){

    srand(unsigned(time(0)));

    for(int i=0;i<n;i++){
        if(rand()/(RAND_MAX+1.0)>0.5)
          b.flip(i);
        if(lcw+(int)b[i]*w[i]<=max_w){
            lcw += w[i]*(int)b[i];
            lcv += v[i]*(int)b[i];
        }
        else b.flip(i);
        }
}
测试数据 1 19 12

2 53 61

3 61 63

4 74 78

5 98 49

6 70 46

7 15 44

8 59 36

9 64 37

10 29 66

11 98 43

12 79 16

13 74 14

14 85 73

15 52 72

16 70 72

17 84 83

18 91 15

19 84 83

20 75 65

21 78 21

22 72 49

23 5 36

24 46 20

25 26 22

26 95 80

27 38 94

28 79 3

29 28 73

30 92 1

31 12 91

32 37 62

33 37 8

34 58 58

35 94 79

36 44 67

37 25 53

38 3 8

39 12 85

40 67 82

41 2 70

42 98 43

43 12 22

44 2 53

45 34 22

46 68 14

47 68 41

48 81 41

49 92 77

50 16 75
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: