挑战性题目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}log2​M的时间,枚举每个数字选择的个数需要k的时间,所以总的时间复杂度为O(k2log2M)O\left(k^2{log}_2{M}\right)O(k2log2​M)。

代码

#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:硬币找换问题相关推荐

  1. NYOJ995 硬币找零(完全背包)

    题目: 硬币找零 时间限制: 1000 ms  |  内存限制: 65535 KB 难度: 3 描述 在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计 算最少的找零硬币数, ...

  2. 找换硬币问题 与 0-1背包问题区别

    之所以再写一篇Blog,是因为现实中很多问题都可以转化成"找换硬币"问题 和 "0-1"背包问题.因此,需要细细理解. 其次,在"参考资料" ...

  3. 动态规划——硬币找零和币值最大化问题

    一.硬币找零问题 1.问题 有面值为1元.3元和5元的硬币若干枚,给定一个输入面额,问如何采用最少的硬币数目,得到当前面额 2.思路 找出状态转移方程,每次可以拿取1元.3元或者5元的硬币,每次拿取, ...

  4. 动态规划——硬币找零思路

    找零的两种问题 硬币找零问题,有两种.一种用贪心解决,一种用动态规划解决. 问题1:假设我们有 v1,v2,--,vn(单位是元)这些币值的硬币,它们的张数分别是 c1.c2.-, cn.我们现在要用 ...

  5. 最少硬币找零系列问题(01背包,完全背包,多重背包动态规划)

    背包问题思路解决最小硬币找零系列问题. 一.01硬币找零问题(01背包) 给定不同面额的硬币 coins 和总金额 m.每个硬币最多选择一次.计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬 ...

  6. (2013.05.05)N枚硬币找1枚假币

    N枚硬币找1枚假币 ――Neicole (2013.05.05) 0. 问题描述 共有N枚硬币,一个天平,在这N枚硬币中有一枚假币,设法找出该枚假币. 1. 原理示例(减治法) 概要: 如上图所示,假 ...

  7. nyoj995硬币找零完全背包

    硬币找零 时间限制: 1000 ms  |  内存限制: 65535 KB 难度: 3 描述 在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计 算最少的找零硬币数,以便他们 ...

  8. 硬币找零问题的动态规划实现

    一,问题描述 给定一组硬币数,找出一组最少的硬币数,来找换零钱N. 比如,可用来找零的硬币为: 1.3.4   待找的钱数为 6.用两个面值为3的硬币找零,最少硬币数为2.而不是 4,1,1 因此,总 ...

  9. 动态规划实战--硬币找零问题

    上一篇文章上提到硬币找零的例子,现在我们实战动态规划就从硬币找零开始 问题描述: 给定 n 种不同面值的硬币,分别记为 c[0], c[1], c[2], - c[n],同时还有一个总金额 k,编写一 ...

  10. Coin Change【硬币找零】

    一.题目 英文:Coin Change 中文:硬币找零 二.内容要求 英文:You are given coins of different denominations and a total amo ...

最新文章

  1. [原]不祥的CPU——Alpha
  2. 微软nni_实践空间站 | 为微软官方开源项目贡献代码,你准备好了吗?
  3. windows+VS2017+opencv4.1.0环境配置
  4. .NET Mvc Razor也可以这样玩!
  5. 程序员打造个人品牌 - Personal Brand的重要性
  6. Kubeflow使用Kubernetes进行机器学习GPU分布式训练
  7. 信息学奥赛一本通(1223:An Easy Problem)
  8. 实战 | 后端日志的前世今生
  9. Tcpip协议详解----动态选路
  10. html css js 注释符号,js 注释怎么写 javascript注释格式|js注释
  11. 考研计算机时间安排表,2019计算机考研这份复习时间表让你自律
  12. 希腊字母表(直接输入希腊字母的方法)
  13. tensor如何实现转置_转置()TensorFlow中的函数
  14. 短视频剪辑如何才能更吸引人?
  15. Vue--Vuex--使用/教程/实例
  16. 微信小程序免费资源大全
  17. 【通讯原理】Ch.4:数字信号调制
  18. mkdir: Failed on local exception: java.io.IOException: javax.security.sasl.SaslException: GSS initia
  19. 服务端开发的实习总结
  20. 超乎想象!关于5G无人机的最强科普!

热门文章

  1. LeetCode-两数之和(Java) 记录下刷题的第一天以及近期迷茫感受
  2. Websocket 从header读取数据
  3. 计算机原理内存详解,【讲给小白的计算机原理】什么是内存,内存的作用?
  4. mysql 更新删除数据,MYSQL数据的插入、删除、更新
  5. 2018年度总结(阉割版)
  6. luoguP4709 信息传递 置换 + 多项式exp
  7. ambari 2.7 下安装httpfs
  8. hudson--插件管理
  9. Leetcode: 3Sum
  10. 发现这里才是我的地方