zoukankan      html  css  js  c++  java
  • 01背包

    View Code
    #include<iostream>
    using namespace std;
    //int n1=5,m1=10//不可以传到函数做参数,如fun[n1][m1],不可以,既是[]内不可以是变量 
    #define m1 10 //有n个物品,背包能承载的重量是m 
    #define n1 5
    int Max(int a,int b){
        return a>=b? a:b;
    }
    
    int DynamicProgramming(int n,int m,int W[],int Value[],int V[n1+1][m1+1],int X[]){
         /*
        int n,m;//有n个物品,背包能承载的重量是m 
        int V[n+1][m+1],X[n+1];
        double W[n+1],Value[n+1];//n个物品的重量和价值*/
        //初始化
        for(int i=0;i<=n;i++) 
            V[i][0]=0;
        for(int j=0;j<=m;j++)
            V[0][j]=0;
        for(int i=1;i<=n;i++)
           for(int j=1;j<=m;j++){
                  if(j<W[i]) V[i][j]=V[i-1][j];
               else{
                      V[i][j]=Max(V[i-1][j],V[i-1][j-W[i]]+Value[i]);
                  } 
           } 
        int j=m;
        for(int i=n;i>=1;i--){
            if(V[i][j]>V[i-1][j]){
                j-=W[i];
                X[i]=1;
            }
               
            else{
                
                X[i]=0;
            }
             
        }
        return V[n][m];
         
    }
    
    int main(){
        //cout<<"Please input n :";
        //cin>>n;
        int V[n1+1][m1+1],X[n1+1];
        int W[n1+1],Value[n1+1];//n个物品的重量和价值*/
        W[0]=0;Value[0]=0;
        
        cout<<"Please input W[] and Value[]:";
        for(int i=1;i<=n1;i++)
          cin>>W[i]>>Value[i];
        cout<<"The max value is:"<<DynamicProgramming(n1,m1,W,Value,V,X)<<endl;
        for(int i=1;i<=n1;i++){
            if(X[i]=1) cout<<i;
        }
        return 0;
    }

     首先要明白满足动态规划的条件:

    一:最优化原理

    二:无后向性

    三:子问题的重叠性

    动态规划问题的解题步骤:

    (我认为学习一门新的算法必须要做的事是:明确算法满足条件,要能够背出来;明确解决满足改算法的步骤,一样能够铭记于心)

    1.把原问题分成各个互相重叠的子问题

    2.判断问题是否满足最优性子结构,若满足则写出递推方程

    3.按照递推式,从底向上求解!

     另一个代码:

    View Code
    #include<iostream>
    using namespace std;
    int V[100][100];//存储前i个物品装入容量为j的背包中获得的最大价值 
    int max(int w1,int w2){
        int w;
        return w=w1>w2?w1:w2;
    } 
    int KnapSack(int n,int *w,int *v,int C,int *x){
        int j;
        for(int i=0;i<=n;i++)
           V[i][0]=0;
        for(int j=0;j<=C;j++)
           V[0][j]=0;
        for(int i=1;i<=n;i++)
            for(j=1;j<=C;j++)
               if(j<w[i])
                  V[i][j]=V[i-1][j];
               else
                  V[i][j]=max(V[i-1][j],V[i-1][j-w[i]]+v[i]); 
        j=C;
        for(int i=n;i>0;i--){
            if(V[i][j]>V[i-1][j]){
               x[i]=1;
                j=j-w[i];
            }
            else x[i]=0;
             
        }
        return V[n][C];
    }
    int main(){
        int n,C;//n物品的个数,C为背包的最大容量 
        int x[100];//记录物品放进背包的状态
        int w[100],v[100]; //第i个物品的重量为w[i]价值为v[i];
        cout<<"物品个数n:";
        cin>>n; 
        cout<<"背包最大容量C:";
        cin>>C;
        cout<<"请输入 "<<n<<"物品的重量的质量:"<<endl;
        for(int i=1;i<=n;i++)
           cin>>w[i]>>v[i];
        cout<<"最大价值:"<<KnapSack(n,w,v,C,x)<<endl;
        cout<<"装进背包的物品编号是:"<<endl;
        for(int i=1;i<=n;i++)
           if(x[i]==1)
              cout<<i<<" "; 
        cout<<endl;
         return 0;
         
    }
  • 相关阅读:
    安卓adb
    图数据库学习
    分布式架构演进
    多活架构
    异地多活
    分布式CRDT
    技术架构的战略和战术原则
    分布式金融架构课笔记
    使用jackson进行json序列化时进行敏感字段脱敏(加密)或者忽略
    读书笔记《演进式架构》
  • 原文地址:https://www.cnblogs.com/aijianiula/p/2570713.html
Copyright © 2011-2022 走看看