我是靠谱客的博主 威武唇膏,最近开发中收集的这篇文章主要介绍多重背包模板题 背包问题V2,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目:https://cn.vjudge.net/contest/180638#problem/B

有N种物品,每种物品的数量为C1,C2......Cn。从中任选若干件放在容量为W的背包里,每种物品的体积为W1,W2......Wn(Wi为整数),与之相对应的价值为P1,P2......Pn(Pi为整数)。求背包能够容纳的最大价值。


思路:利用二分法优化多重背包,将多重背包转化成01背包。

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
#define maxn 50000+5
int dp[maxn],v[105],cost[105],c1[105];
int main()
{
int n, w,i,j,num;
while (~scanf("%d%d",&n,&w))
{
memset(dp, 0, sizeof(dp));
num = 0;
for (i = 1; i <= n; i++)
scanf("%d%d%d", &cost[i], &v[i], &c1[i]);
for (i = 1; i <= n; i++)
{
for (int k = 1; k <= c1[i]; k <<= 1)
{
for (j = w; j >= k*cost[i]; j--)
dp[j] = max(dp[j], dp[j - k*cost[i]] + k*v[i]);
c1[i] -= k;
}
int k = c1[i];
if (k == 0)
continue;
for (j = w; j >= k*cost[i]; j--)
dp[j] = max(dp[j], dp[j - k*cost[i]] + k*v[i]);
}
cout << dp[w] << endl;
}
return 0;
}




最后

以上就是威武唇膏为你收集整理的多重背包模板题 背包问题V2的全部内容,希望文章能够帮你解决多重背包模板题 背包问题V2所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部