01揹包問題一維與二維解法

2021-10-08 10:25:53 字數 839 閱讀 7366

演算法思路

f[i][j]:表示的是只看前i個物品裡面,體積為j種最大的價值

那就分為兩種,拿和不拿

1.f[i][j]=f[i-1][j] 你不拿的情況和f[i-1][j]一致

2.f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]) 

從小到大依次計算即可

#include#include#includeusing namespace std;

const int n = 1005;

int f[n][n];

int v[n],w[n];

int main()

int ans=0;

for(int i=0;i<=m;i++)ans=max(ans,f[n][i]);

cout《一維陣列裡

從大到小的目的就是

講之前二維的f[i-1][j-v[i]]這個狀態壓縮

讓f[j-v[i]]變成一維相同含義的狀態

#include#include#includeusing namespace std;

const int n = 1005;

int f[n];

int v[n],w[n];

int main()

{    int n,m;

cin>>n>>m;

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

cin>>v[i]>>w[i];

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

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

f[j]=max(f[j],f[j-v[i]]+w[i]);

cout《參考自b站 大雪菜

01揹包 分組揹包(一維 二維 搜尋

上面的 中寫了01揹包 分組揹包的一維,二維陣列方法,還有搜尋法以及自己的一些思考。個人對於網上分組揹包的二維轉移方程覺得還不太完善 或者我自己理解的不太對 而且沒有找到很完全的 可能恰好沒找到 所以就自己寫了,有附題目位址,如果想看二維陣列分組揹包,直接拉到最後,前面都是廢話。不想看原位址的,下面...

0 1揹包問題(一維陣列解法)

0 1揹包問題 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。這個問題的特點是 每種物品只有一件,可以選擇放或者不放。演算法基本思想 利用動態規劃思想 子問題為 f i v 表示前i件物品恰放入乙個...

揹包衍化 二維01揹包

問題引入 有兩種物品 銷售,每種包裝裡兩種物品各有x,y x,yx,y個,售價為t tt元,共有s ss個 銷售的包裝。現在需要兩種物品n,m n,mn,m個,問如何購買可以滿足需要並且花費最少的錢 狀態轉移 設d i j d i j d i j 表示第 一 二種物品分別買了i,j i,ji,j個的...