有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個物體不放入揹包,則揹包...