• 01背包回溯法


    View Code
    #include<iostream>
    using namespace std;
    int n;
    float c;
    float bestv=0;
    float backknap(float w[],float v[],int bestx[],int x[],float sw,float sv,int t){
        int j;
        float r;                   //剩余物品的总价值 
        if(t>=n){ 
            if(sv>bestv){          //如果解比当前解更优 
                bestv=sv;
                for(j=0;j<n;j++)   //记录最优解的路径 
                   bestx[j]=x[j];
            }
        }
        else{
            if(sw+w[t]<=c){        //搜索左孩子树 
                x[t]=1;
                sw=sw+w[t];
                sv=sv+v[t];
                bestv=backknap(w,v,bestx,x,sw,sv,t+1);
                sw=sw-w[t];
                sv=sv-v[t];
            }
            r=0;
            for(j=t+1;j<n;j++)     //剩余物品的总价值 
            r=r+v[j];
            if(sv+r>bestv){        //搜索右孩子树 
                x[t]=0;
                bestv=backknap(w,v,bestx,x,sw,sv,t+1);
            }
        }
        return bestv;
    }
    int main(){
        cout<<"请输入n:";
        cin>>n;
        float sv=0,      // 背包当前的质量 
              sw=0;      // 背包当前的重量 
        int bestx[100],  //最优解的路径 
            x[100];      //当前解的路径 
        float w[100],    //物品的重量 
              v[100];    //物品的价值 
        cout<<"请输入物品的重量和价值:"<<endl;
        for(int i=0;i<n;i++)
           cin>>w[i]>>v[i];
        cout<<"请输入背包能承载的重量:"<<endl; 
           cin>>c;
        bestv=backknap(w,v,bestx,x,sw,sv,0);
        cout<<"装进背包的物品是:"<<endl;
        for(int j=0;j<n;j++)
           if(bestx[j]==1)
             cout<<j+1<<"  ";
        cout<<endl;
        cout<<"最大价值是:"<<bestv<<endl;
        return 0;
    }
  • 相关阅读:
    详解Redis中两种持久化机制RDB和AOF(面试常问,工作常用)
    IDEA链接数据库自动生成实体类
    urllib的高级用法
    django项目部署上线
    Git 远程仓库(Github)
    git 标签
    git分支管理
    Git 工作区、暂存区和版本库
    git介绍及安装
    Python3-笔记-numpy学习指南-002-基础
  • 原文地址:https://www.cnblogs.com/aijianiula/p/2819411.html
Copyright © 2020-2023  润新知