有n種物品和乙個容量為w的揹包。第i種物品最多有n[i]件可用,每件重量是w[i],價值是v[i]。求解將哪些物品裝入揹包可使這些物品的重量總和不超過揹包容量,且價值總和最大。
1.使用三重迴圈進行遞推:
狀態轉移式為:dp[i][j]=max
關鍵**如下:
void solve()}}
printf("%d\n",dp[n][w]);
}
然而複雜度為o(v*σn[i]),效率太低。
2.轉換為01揹包
即把第i種物品換成n[i]件01揹包中的物品,這樣就轉換為求σn[i]的01揹包問題,複雜度仍為o(v*σn[i])。
**如下:
#include
#include
using
namespace
std;
const
int maxn = 100+10;
const
int max_n = 1000000;
int w[maxn], v[maxn], a[maxn];
int w_n[max_n], v_n[max_n];
int dp[max_n];
int n, w;
int k;
/*01揹包*/
void solve()
}printf("%d\n",dp[w]);
}int main()
將第i種物品分成若干件物品,其中每件物品有乙個係數,這件物品的重量和價值均是原來的重量和價值乘以這個係數。使這些係數分別為1,2,4,…,2^(k-1),n[i]-2^k+1,且k是滿足n[i]-2^k+1>0的最大整數。例如,如果n[i]為13,就將這種物品分成係數分別為1,2,4,6的四件物品。
這樣就將第i種物品分成了o(log n[i])種物品,將原問題轉化為了複雜度為o(v*σlog n[i])的01揹包問題。
——摘自《揹包九講》
這就是二進位制法。
**如下:
#include
#include
using
namespace
std;
const
int maxn = 100+10;
int n,w;
int w[maxn], v[maxn], a[maxn];
int dp[maxn];
/*01揹包*/
void zero_pack(int w, int v)
}/*完全揹包*/
void comp_pack(int w, int v)
}/*多重揹包*/
void mult_pack(int w, int v, int a)
int k = 1;
while(k < a)
//剩餘的再需要一次01揹包
zero_pack(a*w, a*v);
}int main()
for(int i=0; iprintf("%d\n",dp[w]);
return
0;}
多維多重揹包問題 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 儲存的...
多維多重揹包問題 多重揹包問題
悼念512汶川大 遇難同胞 珍惜現在,感恩生活 急!災區的食物依然短缺!為了挽救災區同胞的生命,心繫災區同胞的你準備自己採購一些糧食支援災區,現在假設你一共有資金n元,而市場有m種大公尺,每種大公尺都是袋裝產品,其 不等,並且只能整袋購買。請問 你用有限的資金最多能採購多少公斤糧食呢?後記 人生是乙...
揹包問題 01揹包 完全揹包 多重揹包
01揹包和完全揹包的區別 01揹包的侷限在於每樣物品只有一種,每個物品都有乙個屬於自己的價值和重量,在給定的物品中選出揹包所能容納的最大重量,要求是價值最大 完全揹包與01揹包的不同在於完全揹包不限制每樣物品的個數,物品的價值和質量都與01揹包一樣,也同樣是求在給定大小的容量中,找出最大價值的選擇 ...