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;
     
}
原文地址:https://www.cnblogs.com/aijianiula/p/2570713.html