揹包學習 多重揹包揹包

2022-05-24 03:06:09 字數 1262 閱讀 2869

有n種物品和乙個容量為v的揹包。第i種物品最多有n[i]件可用,每件費用是c[i],價值是w[i]。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。

狀態轉移方程:f[i][v]=max

此時他面臨的不是01揹包的選與不選的問題,而是從n[i]裡面選多少個的問題。

實現方法:

1:轉化成01揹包,將每種揹包轉換成數量為n[i]的01揹包求解

view code

#include 

#include

#include

using

namespace std;

#define n 107

#define inf 9999999

int c[n],w[n],f[n],b[n];

int max(int x,int y)

int main()}}

printf("

%d\n

",f[n]);

}return

0;}

2:利用二進位制的思想(思考中,給出**實現,原理不理解。。)

view code

#include 

#include

#include

using

namespace std;

const

int max_s = 1007;

int c[max_s],w[max_s],b[max_s],f[max_s];

void zb(int c,int w,int n)

void cb(int c,int w,int n)

}int main()

zb(b[i]*c[i],b[i]*w[i],n);}}

printf("

%d\n

",f[n]);

}return

0;}

3:o(n*v)

view code

#include 

#include

using

namespace std;

const

int max_s = 107;

int f[100007],w[max_s],b[max_s];

//f[i]來表示當前i**是否出現過,

int sum[100007];//

當**達到i時,最多使用這一種硬幣的次數

int main()}}

cout<

揹包學習 多重揹包揹包

有n種物品和乙個容量為v的揹包。第i種物品最多有n i 件可用,每件費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。狀態轉移方程 f i v max 此時他面臨的不是01揹包的選與不選的問題,而是從n i 裡面選多少個的問題。實現方法 1 轉化...

揹包 01揹包,完全揹包,多重揹包

哈哈 01揹包 f i v max 完全揹包 f i v max 多重揹包 f i v max include include include include include define maxn 1000 using namespace std int n,cap int w maxn 重量 花...

多維多重揹包問題 01揹包,完全揹包,多重揹包

csdn 專業it技術社群 登入 blog.csdn.net有n件物品和乙個容量為v的揹包。第i件物品的費用是w i 價值是v i 求將哪些物品裝入揹包可使價值總和最大。1.1空間優化 這要求在每次主迴圈中我們以 v v 0 的遞減順序計算 f v 這樣才能保證計算 f v 時 f v ci 儲存的...