zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    【Quartz】工作原理
    【Quartz】基本原理
    【Quartz】一个小Demo
    【转载】基于Redis实现分布式锁
    【转载】Java 9 新特性——模块化
    【转载】一致性哈希
    大型网站架构演进
    分布式系统概述
    加入tkmybatis,进行批量插入
    mysql,SqlServer批量插入
  • 原文地址:https://www.cnblogs.com/aijianiula/p/2819411.html
Copyright © 2011-2022 走看看