01揹包與部分揹包

2021-10-05 11:23:06 字數 1903 閱讀 1384

有n件物品和乙個容量為c的揹包,第i件物品的費用是w[i],價值是v[i],求在不超過揹包的最大容量下,求能得到最大的價值

dp[i][j]表示前i件物品放入乙個容量為j的揹包可以獲得的最大價值

考慮第i件物品(放與不放)那麼就有兩種狀態。

如果不放,那麼當前價值dp[i][j]=dp[i-1[[j-1],也就是和上乙個狀態相同的價值,因為我們並沒有選擇它放入揹包,所以價值並沒有變

如果放入,那麼我們就要減去這個物品的體積,並加上它的價值,我們在放與不放之間選取乙個最大的dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - back[i].w] + back[i].v);

轉移方程出來了題目就解決了一大半

題目描述

給定n種物品和乙個揹包,物品i的重量是wi,其價值為vi,揹包的容量為c。如何選擇裝入揹包的物品,可以使得裝入揹包中物品的總價值最大?

輸入

每組輸入包括三行,

第一行包括物品個數n,以及揹包容量c。

第二、三行包括兩個一維陣列,分別為每一種物品的價值和重量。

輸出

輸出包括兩行,第一行為揹包的最大總價值,第二行為所選取的物品。

例如:最大總價值=15,物品選取策略為11001。

樣例輸入

5 10

6 3 5 4 6

2 2 6 5 4

樣例輸出

1511001

ac**

#include

using

namespace std;

const

int maxn =

1e6+5;

typedef

long

long ll;

const

int minn =

1e3+10;

int dp[minn]

[minn]

;int a[minn]

;int n, m;

struct node //定義乙個結構體來儲存每個物品的消耗與價值

back[minn]

;int

ans(

)return dp[n]

[m];

//返回最後的最大價值

}int

ans1()

//逆序打表

a[1]

=(dp[1]

[m]>0?

1:0)

;}intmain()

return0;

}

#include

using

namespace std;

const

int maxn =

1e3+10;

struct node

} w[maxn]

;int

main()

sort

(w +

1, w + n +1)

;int i =1;

while

(w[i]

.wi <= c && i <= n)

//裝的下就繼續貪

if(c >0)

//此時揹包剩餘容量小於當前物品的重量,那我們就取其中的一部分

printf

("%.2lf\n"

, ans);}

return0;

}

終有一天,就算沒有蕭蕭班馬鳴,我們也會揮手自茲去,離開熟悉的家鄉,奔向未知的城市。這是成長的必然,也是成才的需要。

0 1揹包與部分揹包

0 1揹包 問題描述 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。所謂0 1揹包,表示每乙個物品只有乙個,要麼裝入,要麼不裝入。解決方案 考慮使用動態規劃 dynamic programming 問題求解 假定ak是放入的最後乙個物...

演算法導論 0 1揹包問題 與 部分揹包

0 1揹包 問題描述 n件物品,第i件物品價值 v i 元,重w i 磅。希望用 w磅的書包 拿走總價值最貴的物品。物品不可以分割故稱為0 1揹包 部分揹包 問題描述 n件物品,第i件物品價值 vi 元,重wi 磅。希望用 w磅的揹包 拿走最重的物品。第i件物品可以都拿走,也可以拿走一部分。物品可以...

揹包 01揹包

01揹包 有n種物品與承重為m的揹包。每種物品只有一件,每個物品都有對應的重量weight i 與價值value i 求解如何裝包使得價值最大。dp i,v 表示前i個物體 包括第i個 面對容量為v的揹包的最大價值,c i 代表物體i的重量,w i 代表物體i的價值 如果第i個物體不放入揹包,則揹包...