递归求解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;}
- 递归求解0 1背包问题
- 回溯法求解0/1背包问题
- 0-1背包问题,动态规划求解
- 回溯法求解0-1背包问题
- 动态规划求解0-1背包问题
- 遗传算法求解0/1背包问题
- 0/1背包问题-----动态规划求解
- 0/1背包问题-----回溯法求解
- 动态规划求解0-1背包问题
- 背包问题的递归与非递归求解
- 0-1背包问题(递归实现)
- 0-1背包问题(递归解决)
- 递归实现0,1背包问题
- rnqoj 拔河问题 一重背包问题(递归求解,dp求解)
- 0-1背包问题递归和非递归实现
- 0-1背包问题递归与非递归实现
- 01背包的递归求解
- 动态规划法求解简单的(0/1)背包问题
- WMS WCS WFS 区别
- 50个超酷的Photoshop的渐变画笔
- assert()函数用法总结
- ZK框架入门知识
- vs中Qt代码感应问题
- 递归求解0 1背包问题
- SERVER 安全
- 送上mac终端 命令行的一些基本操作
- sizeof()用法汇总
- HDU 2669
- unix/linux共享内存应用与陷阱
- mysql set类型和enum类型
- 棋盘(A*)
- LA 4670 Dominating Patterns