0 1揹包問題的遞迴非遞迴兩種解決方法

2021-10-10 08:09:25 字數 1546 閱讀 2753

何為0-1揹包問題?

舉個例子,比如我們有物件物品,五件物品分別對應有著自己的重量和價值,此時我們有乙個揹包,讓你去選擇隨意的裝這五件商品,那麼我們肯定要選擇能最大化利益的一種方法,也就是有限的揹包容量,裝取最大價值的商品,這也就是0-1揹包演算法的核心思想。

如圖,weight表示物品的重量,value表示物品的價值。

此時的i表示揹包的容積,j表示揹包所能裝下的物體數量。

當i=0時,表示揹包所能裝的物體為0個,當j等於0時,表示此時揹包的容積為0,裝不下了。

那麼我們便清楚的意識到我們要求的其實就是這張表上最後的這個值。

話不多說,上**:

//二維陣列,非遞迴

#include

#include

const

int n=5;

//物品數量

const

int s=15;

//揹包的容量

int tmp1,tmp2;

const

int weight=

;//n件物品的重量

const

int value=

;//**

intmain()

}for

(int i=

0;i)for

(int i=

1;i}printf

("%d\n"

,dp[n-1]

[s])

;//求出最優解

for(

int i=n-

1;i>=

0;i--

)else

if(i==

0&&s>=weight[i]

) back[i]=1

;else

back[i]=0

;}for(

int i=

0;i)}

//遞迴方式:

#include

#include

const

int n=5;

//物品數量

const

int s=15;

//揹包的容量

const

int weight=

;//n件物品的重量

const

int value=

;//**

intbackpack

(int n,

int s)

return maxx;}}

intmain()

0 1揹包的遞迴與非遞迴實現

1 0 1揹包遞迴 2 include2 include 3 using namespace std 45 int w 物品重量陣列 6int v 物品價值陣列 7int contain 5 揹包容量 8int y 4 解向量,y i 1表示選取物品,y i 0表示不選取物品910 int f in...

簡單揹包問題 遞迴非遞迴實現

include define max 100 int w max int ans int s,int m if b return 0 else int ans int s,int m stacknode stacknode stack max int i,j,t,top,nofail t 0 top...

簡單的揹包問題 非遞迴和遞迴

問題描述 從一堆物品中選出滿足特定要求的數個物品,求方案 從重量1 4 4 5 7的5個物品中選出數個,要求總重量為10 分析 略 遞迴演算法 int knap int w,int t,int n stack void init stack s int isempty stack s void pu...