当前位置: 首页 > news >正文

hdu 2844 混合背包【背包dp】

http://acm.hdu.edu.cn/showproblem.php?pid=2844

题意:有n种纸币面额(a1,a2,...an),每种面额对应有(c1,c2,...cn)张。问这些钱能拼成1-m中多少种值。

题解:背包dp问题。若ci=1,是01背包,若ci*ai>=m则是完全背包,否则是多重背包。(详见《背包九讲》)

先复习一下三种简单背包形式:

 01背包(F[v] ← max{F[v], F[v −Ci] +Wi} ):

 

  

 完全背包(F[i, v] = max(F[i − 1, v], F[i, v −Ci] +Wi)):

  

 多重背包(利用二进制思想转化为01背包):

  

利用三种背包形式就可以轻松解决此题:

  

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<queue>
 5 #include<vector>
 6 using namespace std;
 7 
 8 int f[100005];
 9 int c[105],a[105];
10 int n,m;
11 
12 void ZeroOnePack(int w,int v)
13 {
14     for(int j=m;j>=v;j--)
15         f[j]=max(f[j],f[j-w]+v);
16 }
17 
18 void CompletePack(int w,int v)
19 {
20     for(int j=v;j<=m;j++)
21         f[j]=max(f[j],f[j-w]+v);
22 }
23 
24 void MultiplePack(int w,int v,int c)
25 {
26     int k=1;
27     while(k<c)
28     {
29         ZeroOnePack(k*w,k*v);
30         c=c-k;k*=2;
31     }
32     ZeroOnePack(c*w,c*v);
33 }
34 
35 int main()
36 {
37     while(scanf("%d%d",&n,&m)==2)
38     {
39         memset(f,0,sizeof(f));
40         if(n==0) break;
41         for(int i=1;i<=n;i++) scanf("%d",&a[i]);
42         for(int i=1;i<=n;i++) scanf("%d",&c[i]);
43         for(int i=1;i<=n;i++){
44             if(c[i]==1)
45                 ZeroOnePack(a[i],a[i]);
46             else if(c[i]*a[i]>=m)
47                 CompletePack(a[i],a[i]);
48             else
49                 MultiplePack(a[i],a[i],c[i]);
50         }
51         int ans=0;
52         for(int i=1;i<=m;i++)
53             if(f[i]==i) ans++;
54         printf("%d\n",ans);
55     }
56     return 0;
57 }

 

转载于:https://www.cnblogs.com/zxhyxiao/p/8407222.html

相关文章:

  • MySQL高可用架构之MHA
  • Js基础知识(四) - js运行原理与机制
  • Bootstrap your Django admin in 3 minutes
  • CALayer动画专题
  • 虽然看的一知半解,但是感觉有一天用到时会很有用,转
  • B1016. 部分A+B (15)
  • OSGi与第一层语义
  • 如何避免TiddlyWiki变慢
  • 山寨一个 Promise
  • 重写、覆盖、重载、多态几个概念的区别分析
  • Ankara prefabrik evler
  • oracle 简单SQL
  • 快速安装配置zabbix_agent端
  • hdu 1754:I Hate It(线段树,入门题,RMQ问题)
  • Unity加载模块深度解析(Shader篇)
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • Github访问慢解决办法
  • IndexedDB
  • jquery ajax学习笔记
  • passportjs 源码分析
  • Python连接Oracle
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • vue数据传递--我有特殊的实现技巧
  • 思考 CSS 架构
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 7行Python代码的人脸识别
  • C# - 为值类型重定义相等性
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #Linux(帮助手册)
  • #pragma multi_compile #pragma shader_feature
  • #Z0458. 树的中心2
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (5)STL算法之复制
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (汇总)os模块以及shutil模块对文件的操作
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • .net framework 4.0中如何 输出 form 的name属性。
  • .net Signalr 使用笔记
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NetCore项目nginx发布
  • .net中调用windows performance记录性能信息
  • @selector(..)警告提示
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • [ACTF2020 新生赛]Upload 1
  • [android] 请求码和结果码的作用
  • [Angularjs]asp.net mvc+angularjs+web api单页应用
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据
  • [autojs]逍遥模拟器和vscode对接