多重揹包模板:
1.多重揹包(優化)
例題:
有n種物品,每種物品的數量為c1,c2......cn。從中任選若干件放在容量為w的揹包裡,每種物品的體積為w1,w2......wn(wi為整數),與之相對應的價值為p1,p2......pn(pi為整數)。求揹包能夠容納的最大價值。
input
第1行,2個整數,n和w中間用空格隔開。n為物品的種類,w為揹包的容量。(1 <= n <= 100,1 <= w <= 50000)output第2 - n + 1行,每行3個整數,wi,pi和ci分別是物品體積、價值和數量。(1 <= wi, pi <= 10000, 1 <= ci <= 200)
輸出可以容納的最大價值。input示例
3 6output示例2 2 5
3 3 8
1 4 1
9
#include#include#includeusing namespace std;
const int maxm = 50005;
int dp[maxm] = , w[105], v[105], c[105];
int main()
for (j = v;j >= c[i] * v[i];j--)
dp[j] = max(dp[j], dp[j - c[i] * v[i]] + c[i] * w[i]);
} printf("%d\n", dp[v]);
return 0;
}
2.利用01揹包和完全揹包
/**
* 多重揹包:
* 有n種物品和乙個容量為v的揹包。第i種物品最多有mi件可用,
* 每件耗費的空間是ci,價值是wi。
* 求解將哪些物品裝入揹包可使這些物品的耗費的空間總和不超過揹包容量,且價值總和最大。
*/
#include #include int max(int a, int b)
#define maxn 100005
int c[maxn], w[maxn], num[maxn];//c:費用 w:價值 num:數量
int dp[maxn];
int v; //v:容量 v1:容量2
//01揹包
void zeroonepack(int c, int w)
} //完全揹包
void completepack(int c, int w)
} //多重揹包
void multiplepack(int c, int w, int num)
else
zeroonepack(num*c, num*w);
} } int main()
return 0;
} /*
1 10 5
5 1 1
4 2 1
3 3 1
2 4 1
1 5 1
** 14
*/
多重揹包模板
有n種物品和乙個容量為v的揹包。第i種物品最多有num i 件可用,每件費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。多重揹包問題的思路跟完全揹包的思路非常類似,只是k的取值是有限制的,因為每件物品的數量是有限制的,狀態轉移方程為 dp i ...
模板 多重揹包
學習了二進位制優化,吼吼!寫個模板,雖然這種型別並不需要模板,但是寫乙個,備忘 模板 int dp n void onezeropack int v int n int w void completepack int v int n int w void multipliepack int v in...
多重揹包模板
hdu 2844 二進位制優化 includeusing namespace std define maxn 100500 define ll long long ll n,m ll num maxn v maxn w maxn ll dp maxn void zeroonepack ll w,ll...