简单的背包问题(非递归和递归)
2012-06-29 13:47
225 查看
问题描述:从一堆物品中选出满足特定要求的数个物品,求方案
从重量1 4 4 5 7的5个物品中选出数个,要求总重量为10
分析:略
递归算法:
非递归算法:
调用算法:
结果:
递归算法可以输出一个解
非递归可以输出所有解
从重量1 4 4 5 7的5个物品中选出数个,要求总重量为10
分析:略
递归算法:
int knap(int w[], int t, int n) { if(t==0) return 1; else if(t<0||t>0&&n<1) return 0; else if(knap(w,t-w[n-1],n-1)==1) { cout<<"result: n="<<n<<", w["<<n-1<<"]="<<w[n-1]<<endl; return 1; } else return knap(w,t,n-1); }
非递归算法:
#include<iostream> #include<string> using std::cout; using std::endl; using std::string; #define MAXLENGHT 1000 typedef int ElementType; #define MAX 100 typedef struct { int data[MAX]; int top; }Stack; void Init(Stack* s){s->top = -1;} int IsEmpty(Stack* s){return (s->top==-1)?1:0;} void Push(Stack* s, int x) { if(s->top == MAX-1)cout<<"full\n"; else s->data[++s->top]=x; } void Pop(Stack *s, int *x) { if(IsEmpty(s)) { cout<<"empty\n";exit(0); } else { *x = s->data[s->top]; s->top--; } } int knap(int w[], int t, int n) { Stack s; int j, k; Init(&s); k = 0; do { while(t>0 && k<n) { if(t-w[k]>=0) { Push(&s, k); t-=w[k]; } k++; } if(t==0) { cout<<"\nresult:\n"; for(j=0; j<=s.top;j++)cout<<s.data[j]+1<<", "<<s.data[j]<<", "<<w[s.data[j]]<<endl; } Pop(&s,&k); t+=w[k]; k++; }while(!IsEmpty(&s) || k!=n); }
调用算法:
int main() { int w[5] = {1,2,7,5,4}; int n=5; int t = 13; knap(w,t,n); return 0; }
结果:
递归算法可以输出一个解
非递归可以输出所有解
相关文章推荐
- 递归—简单背包问题
- 递归6_简单的0/1背包问题 去除相同的数
- 递归5_简单的0/1背包问题
- [算法]简单的背包问题递归解法,C语言实现
- 简单的[0/1]背包问题 分别用递归与非递归实现
- 简单的背包问题--java递归实现
- 简单背包问题-递归非递归实现
- p1054 简单背包问题的递归解法
- 简单背包问题的递归与非递归实现
- 一天一个算法题-简单的-递归-猴子吃桃问题
- HDU 2546 饭卡 简单背包问题
- Dp基础 简单背包问题
- C++ 输出全排列 简单递归 N皇后问题
- HDU 2602 Bone Collector(最简单的0/1背包问题)
- 简单的背包问题
- 几个简单的背包问题
- 1009 贪心算法 (简单分背包问题) 水题
- 简单0-1背包问题
- 简单背包问题
- DP之背包问题+记忆递归