揹包問題的遞迴與非遞迴演算法
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
揹包問題的基本描述是: 有一個揹包,能盛放的物品總重量為S,設有N件物品,其重量分別為w1,w2,...,wn.希望從N件物品中選擇若干件物品,所選物品的重量之和恰能放入該揹包,即所選物品的重量之和等於S。
程式1:遞迴演算法
#include <iostream>
#include <stdlib.h>
using namespace std;
const int N=7;
const int S=20;
int w[N+1]={0,1,4,3,4,5,2,7};
int knap(int s,int n)
{
if(s==0)return 1;
if(s<0||(s>0&&n<1))return 0;
if(knap(s-w[n],n-1))
{
cout<<w[n];
return 1;
}
return knap(s,n-1);
}
int main(int argc, char *argv[])
{
if(knap(S,N))cout<<endl<<"OK"<<endl;
else cout<<"NO"<<endl;
system("PAUSE");
return 0;
}
程式2:非遞迴演算法
#include <iostream>
#include <stdlib.h>
using namespace std;
const int N=7;
const int S=20;
int w[N+1]={0,1,4,3,4,5,2,7};
typedef struct{
int s;
int n;
int job;
}KNAPTP;
int knap(int s,int n)
{
KNAPTP stack[100],x;
int top,k,rep;
x.s=s;
x.n=n;
x.job=0;
top=1;
stack[top]=x;
k=0;
while(k==0&&top>0){
x=stack[top];
rep=1;
while(!k&&rep){
if(x.s==0)k=1;
else if(x.s<0||x.n<=0)rep=0;
else {
x.s=x.s-w[x.n--];
x.job=1;
stack[++top]=x;
}
}
if(!k){
rep=1;
while(top>=1&&rep){
x=stack[top--];
if(x.job==1){
x.s+=w[x.n+1];
x.job=2;
stack[++top]=x;
rep=0;
}
}
}
}
if(k){
while(top>=1){
x=stack[top--];
if(x.job==1)cout<<w[x.n+1];
}
}
return k;
}
int main(int argc, char *argv[])
{
if(knap(S,N))cout<<endl<<"OK"<<endl;
else cout<<"NO"<<endl;
system("PAUSE");
return 0;
}
給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow
相關文章
- 快速排序【遞迴】【非遞迴】排序遞迴
- 原:八皇后問題的遞迴和非遞迴Java實現遞迴Java
- 遞迴演算法轉換為非遞迴演算法的技巧遞迴演算法
- 快速排序(遞迴及非遞迴演算法原始碼)排序遞迴演算法原始碼
- 二叉樹——後序遍歷的遞迴與非遞迴演算法二叉樹遞迴演算法
- 二十一、氣泡排序演算法——JAVA實現(遞迴與非遞迴)排序演算法Java遞迴
- 演算法小專欄:遞迴與尾遞迴演算法遞迴
- 二叉樹的四種遍歷(遞迴與非遞迴)二叉樹遞迴
- 每天刷個演算法題20160521:二叉樹高度(遞迴與非遞迴)演算法二叉樹遞迴
- 漢諾塔非遞迴演算法遞迴演算法
- 遍歷二叉樹-------遞迴&非遞迴二叉樹遞迴
- 遞迴演算法程式設計整數因子分解問題的遞迴演算法遞迴演算法程式設計
- 【演算法拾遺】二分查詢遞迴非遞迴實現演算法遞迴
- 二叉樹建立及遍歷演算法(遞迴及非遞迴)二叉樹演算法遞迴
- 遍歷二叉樹的遞迴與非遞迴程式碼實現二叉樹遞迴
- 每天刷個演算法題20160525:快速排序的遞迴轉非遞迴解法演算法排序遞迴
- 樹遞迴問題的求解遞迴
- Vue3.0的遞迴監聽和非遞迴監聽Vue遞迴
- 遞迴路徑問題遞迴
- 【C++】翻轉二叉樹(遞迴、非遞迴)C++二叉樹遞迴
- [java] 二叉樹的後序遍歷(遞迴與非遞迴實現)Java二叉樹遞迴
- 每天刷個演算法題20160524:阿克曼函式的遞迴轉非遞迴解法演算法函式遞迴
- python-動態規劃的遞迴、非遞迴實現Python動態規劃遞迴
- 遞迴和非遞迴分別實現求n的階乘遞迴
- 斐波那契數列的遞迴和非遞迴實現遞迴
- 遞迴和尾遞迴遞迴
- 用棧+回溯+非遞迴解決N皇后問題遞迴
- 氣泡排序、快速排序(遞迴&非遞迴)、堆排序演算法比較淺析排序遞迴演算法
- 每天刷個演算法題20160523:騎士巡遊的遞迴轉非遞迴解法演算法遞迴
- 【Java資料結構與演算法筆記(二)】樹的四種遍歷方式(遞迴&非遞迴)Java資料結構演算法筆記遞迴
- 遞迴演算法遞迴演算法
- Java遍歷資料夾的兩種方法(非遞迴和遞迴)Java遞迴
- 五大演算法程式碼模板(DFS 遞迴非遞迴都算上,是六個)演算法遞迴
- 【資料結構】二叉樹遍歷(遞迴+非遞迴)資料結構二叉樹遞迴
- 資料結構與演算法——歸併排序: 陣列&連結串列&遞迴&非遞迴解法全家桶資料結構演算法排序陣列遞迴
- 二分法的簡單實現——-遞迴和非遞迴遞迴
- Android遍歷所有控制元件的遞迴和非遞迴實現Android控制元件遞迴
- 迭代與遞迴--你被遞迴搞暈過嗎?遞迴