zoukankan      html  css  js  c++  java
  • C++~回溯+贪心法解决01背包问题

    如果是写作业找到了我这里,希望不要直接copy~仅供参考~可能有错误的,自己写帮助很大^0^

    #include<iostream>
    #include<string.h>
    #include<stdlib.h>
    using namespace std;
    struct item{
        double weight,value;
        int index;
    };
    struct item items[101];
    int x[101];
    int res[101];
    int n;
    double c;
    double max_value;
    bool isOk(int t){
        int i,j;
        double max_c=c,max_v=0;
        for(i=0;i<=t;i++){
            if(x[i]==1){
                max_v+= items[i].value;
                max_c-= items[i].weight;
            }
            if(max_c < 0){
                return false;
            }
        }
    
        for(;i<=n-1;i++){
            if(max_c >= items[i].weight){
                max_v+= items[i].value;
                max_c-= items[i].weight;
            } else {
                max_v=max_v+( max_c*(items[i].value/items[i].weight) );
                max_c=0;
                break;
            }
        }
        if(max_v < max_value)
            return false;
        return true;
    }
    void backtrack(int t){
        int j;
        if(t>=n){
            double cur=0;
            for(j=0;j<n;j++){
                if(x[j]==1)
                    cur+=items[j].value;
            }
            if(cur>max_value){
                max_value = cur;
                for(j=0;j<n;j++){
                    res[j]=x[j];
                }
            }
            return;
        }
        for(int i=1;i>=0;i--){
            x[t]=i;
            if(isOk(t)){
                backtrack(t+1);
            }
        }
    }
    void swap(int i,int j){
        struct item temp;
        temp = items[i];
        items[i] = items[j];
        items[j] = temp;
    }
    void sort(int left,int right){
        if(left > right)
            return;
        int i,j;
        struct item temp;
        i=left;
        j=right;
        temp = items[left];
        while(i!=j){
            while(items[j].value/items[j].weight <= temp.value/temp.weight && i<j){
                j--;
            }
            while(items[i].value/items[i].weight >= temp.value/temp.weight && i<j){
                i++;
            }
            if(i<j){
                swap(i,j);
            }
        }
        items[left] = items[i];
        items[i] = temp;
        sort(left,i-1);
        sort(i+1,right);
    }
    void displayRes(){
        for(int i=0;i<=n-1;i++){
            for(int j=0;j<=n-1;j++){
                if(items[j].index == i){
                    cout<<res[j]<<" ";
                    break;
                }
            }
        }
        cout<<endl;
    }
    int main(){
        cin>>c>>n;
        max_value=0;
        for(int i=0;i<n;i++){
            cin>>items[i].weight>>items[i].value;
            items[i].index=i;
            x[i]=0;
            res[i]=0;
        }
        sort(0,n-1);
        backtrack(0);
        displayRes();
        cout<<max_value<<endl;
    }
  • 相关阅读:
    HTML超文本标记语言(八)——表单<form>
    如何理解JavaScript中给变量赋值,是引用还是复制
    PostCSS 实战
    sass 工具库
    微信小程序-制作简易豆瓣笔记
    学习pano2vr制作html5全景笔记
    git命令笔记
    Gulp实战
    html5-离线存储
    html5
  • 原文地址:https://www.cnblogs.com/rimochiko/p/8168638.html
Copyright © 2011-2022 走看看