算法导论16.2-2 0-1背包问题

来源:互联网 发布:java判断float整数 编辑:程序博客网 时间:2024/05/18 14:45

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


 

原创粉丝点击