揹包問題1

2021-07-27 04:03:58 字數 1104 閱讀 2334

有n個魔法石,重量分別為w1,w2,w3…wn,有乙個可裝重量為s的揹包,從n件魔法石中取若干件,使得放入揹包的重量之和剛好為s,求放的方法,若不存在該種情況則輸出failed。

【輸入樣例】

10(s) 5(n)

(重量)1 2 3 4 5

【輸出樣例】

1 4 5

遞迴,即乙個乙個將物品放入揹包內試一下,設函式judge(s,n)表示剩下n個物品,需要裝入大小為s的包中,如果有解返回1,無解返回0。

1. 取最後乙個物品,

if(judge(s-wn,n-1))

cout<

#include

#include

using

namespace

std;

int v;

int w[5000]=;

bool judge(int s,int n)

else

return judge(s,n-1); //如果裝了第n個包無解則刪除該包嘗試第n-1個

}int main(void)

if(judge(s,n))

cout

<<'\n';

else

cout

<<"failed"

}

其實如果不用列印解的情況的話可以用另外一種方法,也是dp。拿裝箱問題為例,(code vs 1014)

先另建乙個陣列dp,每讀入乙個包裹的大小後遍歷整個陣列,將陣列中值為1的下標加上該包裹大小之後使下標為該值的陣列的值為1,接著讓以該包裹為下標的陣列值為1。如此直至讀入所有包裹,最後從dp[箱子的大小]開始找起,找到陣列的值不為1的地方跳出。這大概就是所謂的用空間換時間??

下面是**:

#include

#include

using

namespace

std;

char b[30000]=;

int main(void)

b[a]=1;

}for(int i=0;i<=v;i++)

}}

揹包問題1

做了兩道揹包問題,迷迷糊糊也算是弄懂了一些揹包的模型。poj1837 這個題主要是建立揹包模型bi比較難,當時沒有想到第二維可以是平衡狀態,看到網上大佬的提示才想到,如下 include include include includeusing namespace std int dp 25 150...

揹包問題(1)

有n件物品,每件物品的重量為w i 價值為v i 現有乙個容量為c的揹包,問如何選取物品放入揹包,使得揹包內物品的總價值最大。其中每種物品都只有一件。用dp i j 表示有前i件物品 揹包容量為j時揹包所能放下物品的最大價值。對每件物品進行決策,不選 0 或是選 1 狀態轉移方程 dp i j ma...

揹包問題 1 揹包的引入

上篇文章我考慮的是可以找零的方式有幾種,是運用搜尋解決的,但是如果我們要解決的是優化問題,就是說最小要多少硬幣呢?題目的位址是 其實他是乙個揹包問題,所以我準備重學一下。最近做硬幣找零問題,它實際是個揹包問題,很多知識掌握的不紮實。這裡重新總結一下,老規矩,還是靠題目驅動,下面所有題目都給了鏈結 大...