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;
}