博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 2844 混合背包【背包dp】
阅读量:7070 次
发布时间:2019-06-28

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

题意:有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
2 #include
3 #include
4 #include
5 #include
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
=m)47 CompletePack(a[i],a[i]);48 else49 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

你可能感兴趣的文章
mogilefs管理
查看>>
linux运维学习之ansib基础知识详解
查看>>
mysql备份脚本(转)
查看>>
14-思科防火墙:ASA对IP分片的处理
查看>>
C语言scanf函数用法详细解释!
查看>>
计算机操作系统启动和Linux boot
查看>>
读书笔记14:适配器模式
查看>>
Oracle实用-01:绑定变量
查看>>
我的友情链接
查看>>
扫描端口占用情况的python脚本
查看>>
STL::vector讲解
查看>>
没有银弹
查看>>
浅谈java.lang.ThreadLocal类
查看>>
梦想者市集:创业的核心能力(上)
查看>>
SSL卸载+IP保护(攻击)+异地容灾+横向扩展
查看>>
工匠精神需要职业通道的支持
查看>>
ubuntu 开机启动小键盘
查看>>
ORACLE-RMAN-自动恢复命令
查看>>
【LeetCode】409. Longest Palindrome (java实现)
查看>>
jquery form插件ajaxForm/ajaxSubmit时 IE8 提示下载
查看>>