0-1背包问题(动态规划)

#include<bits/stdc++.h>
#define n 5
#define capacity 10
using namespace std;
int w[n+1] = {-1,2,2,6,5,4};
int v[n+1] = {-1,6,3,5,4,6};
int m[n+1][capacity+1];
int x[n+1];
int min(int a,int b){
  if(a<b) return a;
  return b;
}
int max(int a,int b){
  if(a>b) return a;
  return b;
}
void Knapsnak(){
   int jMax = min(w[n]-1,capacity);
   for(int i=0;i<=jMax;i++){
    m[n][i] = 0;
   }
   for(int i=w[n];i<=capacity;i++){
    m[n][i] = v[n];
   }
   for(int i=n-1;i>1;i--){
    jMax = min(w[i]-1,capacity);
    for(int j=0;j<=jMax;j++){
        m[i][j] = m[i+1][j];
    }
    for(int j=w[i];j<=capacity;j++){
        m[i][j] = max(m[i+1][j],m[i+1][j-w[i]]+v[i]);
    }

   }
   m[1][capacity] = m[2][capacity];
   if(capacity>w[1]){
    m[1][capacity] = max(m[2][capacity],m[2][capacity-w[1]]+v[1]);
   }
}
void Print_m(){
   cout<<"m[i][j] matrix"<<endl;
  for(int i=1;i<=n;i++){
    for(int j=0;j<=capacity;j++){
        cout<<setw(3)<<setiosflags(ios::left)<<m[i][j];
    }
    cout<<endl;
  }
}
void TraceBack(){
    int c = capacity;
    for(int i=1;i<=n-1;i++){
        if(m[i][c]==m[i+1][c]){
           x[i] = 0;
        }
        else{
            x[i] = 1;
            c -= w[i];
        }
    }
    if(c > w[n])
        x[n] = 1;
}
void Print_x(){
    cout<<"x[] matrix"<<endl;
    for(int i=1;i<=n;i++)
        cout<<x[i]<<" ";
}
int main(){

   Knapsnak();
   Print_m();
   TraceBack();
   Print_x();
   cout<<endl;
   cout<<"max value"<<endl;
   int sum = 0;
   for(int i=1;i<=n;i++)
    sum += x[i]*v[i];
   cout<<sum;
   return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值