C C 之01揹包問題

2021-10-05 12:19:57 字數 2368 閱讀 6043

問題描述

給定n個物品,每個物品有乙個重量w和乙個價值v.你有乙個能裝m重量的揹包.問怎麼裝使得所裝價值最大.每個物品只有乙個.

輸入格式

輸入的第一行包含兩個整數n, m,分別表示物品的個數和揹包能裝重量。

以後n行每行兩個數wi和vi,表示物品的重量和價值

輸出格式

輸出1行,包含乙個整數,表示最大價值。

樣例輸入

3 52 3

3 54 7

樣例輸出

8資料規模和約定

1<=n<=200,m<=5000.

第一種解法,先對揹包通過重量排序,當重量不能放入的時候退出,主要方法是dfs+剪枝,但是超時了,可能是資料規模太大,效率不高導致超時

#include

#include

using

namespace std;

struct nodearr[

200]

;int n,w;

intcmp

(node n1,node n2)

int _max=0;

void

dfs(

int weight,

int index)

dfs(weight,value,index+1)

;dfs

(weight-arr[index]

.weight,value+arr[index]

.value,index+1)

;}intmain()

第二種解法dfs,其實和第一種解法感覺差不多,但是通過結果來看,好像比第一種效果更好,不過還是難逃超時

#include

using

namespace std;

int w[

1000];

int v[

1000];

int n;

int w;

intdfs

(int i,

int ww)

else

ans= v2;

return ans;

}int

main()

int ww=w;

cout<<

dfs(

0,ww)

;}

第三種解法,是第二種的剪枝,採用記憶的方法實現剪枝

#include

using

namespace std;

int w[

1000];

int v[

1000];

int n;

int w;

int dp[

1000][

1000];

intdfs

(int i,

int ww)

else

ans= v2;

dp[i]

[ww]

=ans;

return ans;

}int

main()

int ww=w;

cout<<

dfs(

0,ww)

;}

第四種解法,通過迭代求解,主要通過二維陣列記錄當前節點的最大價值,然後一步步迭代,最終求得結果

#include

using

namespace std;

int n,w;

int weight[

5010];

int value[

300]

;int dp[

300]

[5010];

intmain()

else

dp[i]

[j]=dp[i-1]

[j];

cout<[w];

return0;

}

可重複

#include

#include

#include

using

namespace std;

int n,m;

int w[

5010

],v[

5010];

int dp[

5010][

5010];

intmain()

for(

int i=

1; i<=n; i++

)//數量;

}printf

("%d\n"

,dp[n]

[m]);}

return0;

}

0 1揹包問題(c c )

問題介紹 現在有乙個可以載重w的揹包和n個物品,每個物品的重量和 分別為wi 和vi 請選擇所裝物品,使得在不超過揹包載重的前提下,揹包裡的物品 最高。include include using namespace std w 揹包最大載重 n 物品總數 ws 物品重量 vs 物品價值 res i ...

揹包問題之01揹包問題

題目 有n件物品和乙個容量為v的揹包。第i件物品的容量是c i 價值為w i 求解將哪些物品裝入揹包可以使得這些物品的費用總和不超過揹包容量,且價值總和最大。基本思路 作為最基礎的揹包問題,特點是 每種物品只有一件,可以選擇放或者是不放。用子問題定義狀態 f i v 表示前i件物品恰好放入乙個容量為...

揹包問題之01揹包

01揹包就是說針對每一件物品,有選擇裝入或者放棄,是屬於動態規劃類的問題。現在假設我們有m件物品,各有價值,揹包承重為10,假設當前可用的承重量為v,當前在抉擇第m件物品是否放入,重量為w1,價值為v1,那麼,如果不放入,我們的價值應該保持不變,並與之前算出的最大價值相同,如果放入,放入後的價值就是...