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