0/1背包问题-----动态规划实现

问题描述:一个背包容量为m(能装下m千克的物品),现有n中货源,第i种货源的重量为wi,利润为pi,求怎样收购能获得最大利润

本人采用递归方法解决问题

整体思想:对于每一件物品只考虑“选择与不选择”,选择的要求是背包能容下。最后选取利润较大的作为最终利润结果。

核心代码: max2=knap5(m1,ii)+p[i];  //当前背包容量m1大于第i件物品的重量,递归调用并将当前物品装入背包


源码:

include<stdio.h>
float w[2]={2,5},p[2]={3,4},n=2,m=5;
knap5(int m,int i){
    int m1=m;
    int ii=i;
float max1,max2,t;
if(i==0)
    return 0;
max1=knap5(m,i-1);   //无论m是否大于第i件物品不选取第i件物品时的递归关系
if(m1>=w[i]){
    m1=m1-w[i];
    ii-=1;
    max2=knap5(m1,ii)+p[i];   //当前背包容量m1大于第i件物品的重量,递归调用并将当前物品装入背包
}


if(max1>max2){
    t=max1;
}
else{
    t=max2;  // 取较大的价值装入背包
}
return(t);


}


void main(){
int s=0,i;
printf("%f  %f \n",m,n);//输出背包容量和物品种类
for(i=1;i<=n;i++){
   printf("%f  %f \n",w[i],p[i]); //输出每种物品的重量和价值
   s=s+w[i];
}


if(s<=m){
    printf("所有物品全部装入背包!");  //当所有物品总重量小于背包容量时,全部装入背包
    return ;
}
float mid3=knap5(m,n);
printf("max= %f",mid3);


}

运行截图:




猜你喜欢

转载自blog.csdn.net/congcong7267/article/details/80576381