裝箱問題及延伸

2021-09-24 15:48:08 字數 1439 閱讀 1154

有乙個箱子容量為v(正整數,o≤v≤20000),同時有n個物品(30),每個物品有乙個體積 (o≤正整數≤10000)。要求從 n 個物品中,任取若千個裝入箱內。

方法1

設 f [ i ] 為不超過 i 的最大值,就可以看做揹包。即費用等於價值。

得 f [ j ] = max

#includeusing namespace std;

int read()

int f[20005],a[35];

int main()

方法2

設 f [ i ] 為bool,為真就是能加成 i ,反之亦然。

得if( f [ j - a [ i ] ] == true ) f [ j ]=true;

最後從 v 往前找,第乙個為真的。

f[0]=1;

for(i=1;i<=n;i++)

a[i]=read();

for(i=1;i<=n;i++)

for(j=v;j>=a[i];j--)

if(f[j-a[i]]==1)

f[j]=1;

for(i=v;i>=0;i--)

if(f[i])

不要在意箱子裝不裝得下

同理

設 f [ i ] 為不小於 i 的最小值。防止第 j 個加不到,可能把f [ j + 1 ]的值賦上去。(因為f [ j + 1 ] > j +1 ,所以f [ j + 1 ] > j。)

注意:陣列需要先初始化。

j > a[ i ]時

f [ j ]= min

else

f [ j ]=min ( f [ j ] , a[ i ] )

#includeusing namespace std;

int read()

int f[20005],a[35];

int main()

方法2同理

注意:因為是大於 v ,所以迴圈時,大於 v的一些範圍也要迴圈。

f[0]=1;

for(i=1;i<=n;i++)

a[i]=read();

for(i=1;i<=n;i++)

for(j=v+a[i];j>=a[i];j--)

if(f[j-a[i]]==1)

f[j]=1;

for(i=v;i<=v+10000;i++) //a[i]最大為10000

if(f[i])

迷宮問題及延伸

迷宮問題 問題描述 給定乙個m n的迷宮圖,求所有從指定入口 到出口的路徑。假設迷宮圖如下圖所示 其中m 6,n 6,含 外圍加上一圈不可走的方塊,這樣做的目的是避免在查詢時 出界 迷宮由方塊構成,空白方塊表示可以走的通道,帶 陰影方塊表示不可走的障礙物。要求所求路徑必須是簡單路徑,即在求得的路徑上...

struct sockaddr定義及延伸

跟蹤看一下 strcut sockaddr 是怎麼定義的,這個定義在 usr include bits socket.h裡 引用 struct sockaddr 由上可見,sockaddr 結構體的第乙個成員是乙個巨集定義,再來看一下這個巨集定義 在 usr include bits sockadd...

問題A 裝箱問題

思路 思路 根據演算法筆記上01揹包問題的一維形式改編,就僅僅是把每件物品的價值改為1,再未做其他修改,後來發現不行 const int maxn 1001 int dp maxn int w maxn int main for int i 0 i參照別人的答案,進行的思考 首先,狀態轉移方程 dp...