#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;
}
0-1背包问题(动态规划)
最新推荐文章于 2021-12-10 13:37:41 发布