挑战性题目DSCT101:硬币找换问题
挑战性题目DSCT101:硬币找换问题
问题描述
有一堆数字,1,2,4,8,⋯,2n1,2,4,8,\cdots,2^n1,2,4,8,⋯,2n,每个数字各两个。要求选取部分数字,相加凑出一个给定的数字MMM。
题解
假如每个数字只有111个,那么每个正整数MMM自然只有一种表示方式。当每种数字都有222个时,那么2i2^i2i可以被两个2i−12^{i-1}2i−1的数字表示,所以可以通过组合多个面值小的数字来代替面值大的数字。而由于每种数字仅有222个,所以无论如何组合1∼2i−11\sim2^{i-1}1∼2i−1面值的数字,最多只能再凑出一个面值为2i2^i2i的数字。
所以我们使用动态规划中的数位dp算法,使用数组dp[i][j]
来表示考虑到面值为2i2^i2i的数字,且已经用小面值的数字凑出了jjj个2i2^i2i面值的数字的方案数。在转移时,我们枚举选取2i2^i2i数字的个数kkk,当(i+j)%2(i+j)\%2(i+j)%2等于我们需要凑出的面值的第iii个二进制位时,就表示我们完成了这一位的表示,并且可以向前进位了,于是dp[i+1][(j+k)/2]
的方案数就加上dp[i][j]
的方案数。
最后,总的方案数即保存在处理完所有二进制位,并且不进位的情况中,即ans=dp[log_2(M)+1][0]
。
基于此,对于每种数字都有kkk个的情况,仍然可以照此处理,jjj的取值范围为0∼⌊k2i−12i⌋≈k0\sim\left\lfloor k\frac{2^i-1}{2^i}\right\rfloor\approx k0∼⌊k2i2i−1⌋≈k,而枚举M的每一位需要log2M{log}_2{M}log2M的时间,枚举每个数字选择的个数需要k的时间,所以总的时间复杂度为O(k2log2M)O\left(k^2{log}_2{M}\right)O(k2log2M)。
代码
#include<stdio.h>
#include<stdlib.h>
int dp[33][3],n,i,j,k;
int main(int argc,char* argv[])
{n=atoi(argv[1]);dp[0][0]=1;for(i=0;(1ll<<i)<=n;++i)for(j=0;j<=1;++j)for(k=0;k<=2;++k)if((j+k&1)==(1&(n>>i)))dp[i+1][j+k>>1]+=dp[i][j];printf("%d\n",dp[i][0]);
}
挑战性题目DSCT101:硬币找换问题相关推荐
- NYOJ995 硬币找零(完全背包)
题目: 硬币找零 时间限制: 1000 ms | 内存限制: 65535 KB 难度: 3 描述 在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计 算最少的找零硬币数, ...
- 找换硬币问题 与 0-1背包问题区别
之所以再写一篇Blog,是因为现实中很多问题都可以转化成"找换硬币"问题 和 "0-1"背包问题.因此,需要细细理解. 其次,在"参考资料" ...
- 动态规划——硬币找零和币值最大化问题
一.硬币找零问题 1.问题 有面值为1元.3元和5元的硬币若干枚,给定一个输入面额,问如何采用最少的硬币数目,得到当前面额 2.思路 找出状态转移方程,每次可以拿取1元.3元或者5元的硬币,每次拿取, ...
- 动态规划——硬币找零思路
找零的两种问题 硬币找零问题,有两种.一种用贪心解决,一种用动态规划解决. 问题1:假设我们有 v1,v2,--,vn(单位是元)这些币值的硬币,它们的张数分别是 c1.c2.-, cn.我们现在要用 ...
- 最少硬币找零系列问题(01背包,完全背包,多重背包动态规划)
背包问题思路解决最小硬币找零系列问题. 一.01硬币找零问题(01背包) 给定不同面额的硬币 coins 和总金额 m.每个硬币最多选择一次.计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬 ...
- (2013.05.05)N枚硬币找1枚假币
N枚硬币找1枚假币 ――Neicole (2013.05.05) 0. 问题描述 共有N枚硬币,一个天平,在这N枚硬币中有一枚假币,设法找出该枚假币. 1. 原理示例(减治法) 概要: 如上图所示,假 ...
- nyoj995硬币找零完全背包
硬币找零 时间限制: 1000 ms | 内存限制: 65535 KB 难度: 3 描述 在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计 算最少的找零硬币数,以便他们 ...
- 硬币找零问题的动态规划实现
一,问题描述 给定一组硬币数,找出一组最少的硬币数,来找换零钱N. 比如,可用来找零的硬币为: 1.3.4 待找的钱数为 6.用两个面值为3的硬币找零,最少硬币数为2.而不是 4,1,1 因此,总 ...
- 动态规划实战--硬币找零问题
上一篇文章上提到硬币找零的例子,现在我们实战动态规划就从硬币找零开始 问题描述: 给定 n 种不同面值的硬币,分别记为 c[0], c[1], c[2], - c[n],同时还有一个总金额 k,编写一 ...
- Coin Change【硬币找零】
一.题目 英文:Coin Change 中文:硬币找零 二.内容要求 英文:You are given coins of different denominations and a total amo ...
最新文章
- [原]不祥的CPU——Alpha
- 微软nni_实践空间站 | 为微软官方开源项目贡献代码,你准备好了吗?
- windows+VS2017+opencv4.1.0环境配置
- .NET Mvc Razor也可以这样玩!
- 程序员打造个人品牌 - Personal Brand的重要性
- Kubeflow使用Kubernetes进行机器学习GPU分布式训练
- 信息学奥赛一本通(1223:An Easy Problem)
- 实战 | 后端日志的前世今生
- Tcpip协议详解----动态选路
- html css js 注释符号,js 注释怎么写 javascript注释格式|js注释
- 考研计算机时间安排表,2019计算机考研这份复习时间表让你自律
- 希腊字母表(直接输入希腊字母的方法)
- tensor如何实现转置_转置()TensorFlow中的函数
- 短视频剪辑如何才能更吸引人?
- Vue--Vuex--使用/教程/实例
- 微信小程序免费资源大全
- 【通讯原理】Ch.4:数字信号调制
- mkdir: Failed on local exception: java.io.IOException: javax.security.sasl.SaslException: GSS initia
- 服务端开发的实习总结
- 超乎想象!关于5G无人机的最强科普!