背包问题

来源:互联网 发布:office2011 mac破解版 编辑:程序博客网 时间:2024/05/28 23:12
#include<iostream>using namespace std;int max(int x,int y){if(x>y) return x;else return y;}int min(int x,int y){if(x<y) return x;else return y;}void Knapsack(int *v,int *w,int c,int n,int m[][1000]){int jMax=min(w[n]-1,c);for(int j=0;j<=jMax;j++) m[n][j]=0;for(int j=w[n];j<=c;j++) m[n][j]=v[n];for(int i=n-1;i>=1;i--){jMax=min(w[i]-1,c);for(int j=0;j<=jMax;j++) m[i][j]=m[i+1][j];for(int j=w[i];j<=c;j++) m[i][j]=max(m[i+1][j],m[i+1][j-w[i]]+v[i]);}}void Traceback(int m[][1000],int *w,int c,int n,int *x){for(int i=1;i<n;i++){if(m[i][c]==m[i+1][c]) x[i]=0;else{x[i]=1;c-=w[i];}}x[n]=(m[n][c])?1:0;}int main(){int w[10];//各个物品的重量 int c;//背包容量int v[10];//各个物品的价值int n;//物品的个数int m[10][1000];//对于m[i][j] 而言,其表示m(i,j)的最优解,即背包容量为j,可选物品为i,i+1,...,n时0-1背包问题的最优值int x[10];//标记各个物品是否装入 /*递归表达式如下:m(i,j)=max{m(i+1,j),m(i+1,j-w[i])+v[i]}   j>=w[i]      =m(i+1,j)   0<=j<w[i]    m(n,j)=v[n]   j>=w[n]      =0   0<=j<w[n]*/ cin>>c;cin>>n;for(int i=1;i<=n;i++){cin>>w[i]>>v[i];}Knapsack(v,w,c,n,m);Traceback(m,w,c,n,x);cout<<m[1][c]<<endl;for(int i=1;i<=n;i++)cout<<x[i]<<endl;return 0;} 

0 0