博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51Nod:1086背包问题 V2
阅读量:5091 次
发布时间:2019-06-13

本文共 887 字,大约阅读时间需要 2 分钟。

基准时间限制:1 秒 空间限制:131072 KB 分值: 40 
有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)第2 - N + 1行,每行3个整数,Wi,Pi和Ci分别是物品体积、价值和数量。(1 <= Wi, Pi <= 10000, 1 <= Ci <= 200)
Output
输出可以容纳的最大价值。
Input示例
3 62 2 53 3 81 4 1
Output示例
9

按二进制拆分物品,然后按照01背包来进行处理,复杂度O(VN)

#include
using namespace std;const int x=1e6;int a[x],b[x],c[x];int dp[x]; int main(){ int n,w; int i,j; cin>>n>>w; for(i=1;i<=n;i++) cin>>a[i]>>b[i]>>c[i]; memset(dp,0,sizeof(0)); for(i=1;i<=n;i++) { int d1=1,d2=c[i]; while(d1
=d1*a[i];j--) { dp[j]=max(dp[j],dp[j-d1*a[i]]+b[i]*d1); } d2-=d1; d1*=2; } for(j=w;j>=d2*a[i];j--) dp[j]=max(dp[j],dp[j-d2*a[i]]+b[i]*d2); } cout<
<

转载于:https://www.cnblogs.com/Friends-A/p/9309043.html

你可能感兴趣的文章
iOS开发之让你的应用“动”起来
查看>>
android studio怎么添加.so文件?android studio加载so文件的方法
查看>>
LeetCode - Reverse Linked List II
查看>>
SSD果然劲爆!
查看>>
排序算法总结
查看>>
如何快速理解一个全新的嵌入式操作系统(转载)
查看>>
国泰安面试总结
查看>>
[bzoj3270]博物馆
查看>>
转-Windows下anaconda简单使用教程
查看>>
javascript中Math函数的属性与方法
查看>>
树链剖分入门讲解
查看>>
LeetCode-Symmetric Tree
查看>>
安卓的全局变量
查看>>
个人工作总结07(第二阶段)
查看>>
Django 使用jQuery实现ajax
查看>>
函数(二)
查看>>
SQL 执行顺序
查看>>
字典的应用(根据第一列,统计第二列之和)
查看>>
Docker镜像文件操作
查看>>
BZOJ 1027 合金
查看>>