递归求解0 1背包问题

来源:互联网 发布:淘宝装修日记论坛 编辑:程序博客网 时间:2024/05/16 10:25

递归函数就是直接或间接调用自身的函数。

递归式:

    当wn>C时,  f(n,C)=f(n-1,C);

    当wn<=C时,f(n,C) = max(f(n-1,C), vn+f(n-1, C-wn) );

    初始条件为:f(i, 0) = 0; f(0,i) = 0; f(0,0) = 0;

#include <stdio.h>#define MAX 100int weight[MAX];int price[MAX];int y[MAX]={0};//进行递归主要方法int f(int t,int c){if((t==0)||c<=0){  //当物品个数为0或背包容积为0事退出  return 0;}else{for(int i=t-1;i>=0;i--){  if(weight[i]>c){   //当物品重量大于背包容积y[i]=0;        //此时物品不被选中return f(t-1,c);  //在剩余物品中选取}else{inttemp1=f(t-1,c); //当第t个物品没被选中时inttemp2=price[i]+f(t-1,c-weight[i]);//被选中时if(temp1>temp2){y[i]=0;return f(t-1,c);}else{y[i]=1;return price[i]+f(t-1,c-weight[i]);}}}}}int main(){    int c,t,maxval,i;printf("请输入物品的的个数:");scanf("%d",&t);for(i=0;i<t;i++){y[i]=0;printf("\n请输入第%d个物品的重量和价值",i+1);scanf("%d%d",&weight[i],&price[i]);}printf("\n请输入背包的容积");scanf("%d",&c);    maxval=f(t,c);   printf("j结果为:1代表选中");for(i=0;i<t;i++){//if(y[i]==1)printf("\n%d %d %d\n",y[i],weight[i],price[i]);}printf("总价值为:%d",maxval);    return 0;}