0-1背包问题使用动态规划算法。
空间未优化的代码:
#include<iostream> using namespace std; int Max(int i,int j) { return i>j?i:j; } void KnapSack(int *w,int *p,int (*f)[30],int length,int volume) { int i,j; for(i=w[1];i<=volume;i++) { f[1][i]=w[1]*p[1]; } for(i=2;i<=length;i++) { for(j=volume;j>=0;j--) { if(j>=w[i]) { f[i][j]=Max(f[i-1][j],f[i-1][j-w[i]]+w[i]*p[i]); } else { f[i][j]=f[i-1][j]; } } } } int main() { int w[11]={0,4,5,6,3,2,7,8,9,10,11}; int p[11]={0,5,6,2,3,1,4,8,7,5,6}; int w1[6]={0,1,2,3,4,5}; int p1[6]={0,5,4,3,2,1}; int W=25; int W1=6; int f[30][30]={0}; KnapSack(w,p,f,10,W); cout<<f[10][25]<<endl; }
空间进行优化后的代码:
//01pack //此代码可以更加优化 #include<iostream> using namespace std; double max(double a,double b) { return a>b? a:b; } //假设每件物品的重量为正整数 double EasyPack(int volume,int n,int Weight[],double Cost[]) { double Total_Value[10000]={0}; int i,j; for(i=0;i<n;i++) { for(j=volume;j>=0;j--) { if(j>=Weight[i]) Total_Value[j]=max(Total_Value[j],Total_Value[j-Weight[i]]+Weight[i]*Cost[i]); } } return Total_Value[volume]; } int main() { //volume 为背包的容量,n为物品的数量,且每种物品只有一件 int volume,n; //Cost[i]为第i件物品的价格 double Cost[10000]; //Weight[i]为第i件物品的重量,此处的重量假设都为整型 int Weight[10000]; int w[10]={4,5,6,3,2,7,8,9,10,11}; int p[10]={5,6,2,3,1,4,8,7,5,6}; while(cin>>volume>>n) { int i; for(i=0;i<n;i++) { cin>>Weight[i]>>Cost[i]; } double sum=EasyPack(volume,n,Weight,Cost); cout<<sum<<endl; } return 0; }