零钱有限制和没有限制的找零钱问题

news/2025/3/15 5:08:41/

在参加腾讯模拟考的时候,其中的一道编程题是找零钱的问题,但是零钱的数量是一定的,并不是无限的。而且零钱都是2的K次幂,1,2,4,8,16,….每种零钱的数量是 2,给定一个数 n (

int k_count = 0;long long  k_sum = 1;while (k_sum < n)           //小于且最接近n的2的K次幂的整数{k_sum = k_sum * 2;k_count++;}vector<long long > arr(k_count, 0);   //把相应的零钱存入数组中k_sum = 1;arr[0] = 1;for (int i = 1; i < k_count; ++i){k_sum *= 2;arr[i] = k_sum;}

要枚举的动态规划的方法

vector<long long> temp(n+1, 0);vector<vector<long long>>  dp(k_count, temp);for (int i = 0; i < k_count; ++i)dp[i][0] = 1;dp[0][1] = 1;        //因为每种零钱的数量只有两张dp[0][2] = 1;for (int i = 1; i < k_count; ++i){for (int j = 1; j <= n; ++j){if (j < arr[i])                  //如果总的钱数,小于当前的零钱dp[i][j] = dp[i - 1][j];else{int count = 0;for (int k = 0; arr[i] * k <= j && k < 3; ++k)     //计算用 k 张arr[i] 的零钱的时候,用多少张找零的方式count += dp[i - 1][j-arr[i]*k];dp[i][j] = count;}}}

后来采用优化的动态规划,发现结果不对

for (int i = 1; i < k_count; ++i){for (int j = 1; j <= n; ++j){if (j < arr[i])                  //如果总的钱数,小于当前的零钱dp[i][j] = dp[i - 1][j];else{               dp[i][j] = dp[i - 1][j] + dp[i][j-arr[i]];      //在每张零钱的张数限制的条件下时不能采用这种优化的方法}}}

后来发现问题是,因为零钱的数量是限制的,所以不能采用这种优化的方法,只能通过枚举来实现动态规划,dp[i][j] = dp[i - 1][j] + dp[i][j-arr[i]]; 这个表达式中已经用了一次 arr[i],而你在用 dp[i][j-arr[i]]时,这个方法中也会用掉 arr[i],所以就会造成结果出错的情况,如果有无限的零钱的话,那就可以采用优化过的动态规划算法。


http://www.ppmy.cn/news/510506.html

相关文章

MySQL之误删数据如何处理

写在前面 在工作中不管是程序bug&#xff0c;运维的失误&#xff0c;等&#xff0c;都有可能导致数据误删除&#xff0c;或者是误操作&#xff0c;此时我们就必须快速的恢复数据&#xff0c;避免对正常业务造成过大的影响&#xff0c;甚至出现事故&#xff0c;本文我们按照如下…

家庭理财,轻松记账修改收支记录这样操作

我们在记账的时候难免会出现记错或者想修改的地方&#xff0c;又或者是想将之前太久没有用的记账记录删除掉&#xff0c;今天&#xff0c;小编就教大家如何修改收支记录&#xff0c;一起接着往下看吧&#xff01; 第一步&#xff0c;运行【晨曦记账本】在软件主界面中&#xff…

EXCEL如何真正彻底去掉小数点后的数字

EXCEL如何真正彻底去掉小数点后的数字 目录 EXCEL如何真正彻底去掉小数点后的数字 例如&#xff1a; &#xff08;1&#xff09;我们设置不保留小数取整&#xff0c;它的显示效果是19869&#xff0c;但实际上&#xff0c;它的值并没有变&#xff0c;还是19869.1538&#xf…

微信转账记录删除了服务器还有吗,微信转账记录能彻底删除吗?你应该知道的删除技巧是这三种!...

微信转账记录能彻底删除吗&#xff1f;有时我们需要删除微信转账记录&#xff0c;为了自己的账户安全&#xff0c;同时为了保证隐私&#xff0c;但是如何才能彻底删除转账记录呢&#xff1f;相信现在很多小伙伴肯定不知道如何彻底删除&#xff0c;不过没关系&#xff0c;小编找…

微信零钱明细删除后服务器有记录吗,微信零钱明细怎么删除记录?教你微信零钱明细记录如何删除...

微信零钱明细怎么删除记录?教你微信零钱明细记录如何删除 2017-12-21 15:32:27 来源&#xff1a;网络 扫码可以&#xff1a; 1.在手机上浏览 2.分享给微信好友或朋友圈 摘要&#xff1a; 微信零钱明细怎么删除记录?手把手教你微信零钱明细记录如何删除 大家经常会用微信支付…

无主之地2 不费子弹手枪

不费子弹手枪 BL2(hwAAAADxCACE5wRABhGL6cOIhYEQIwLG/38KGB4w/v8rxEiDgRHj) BL2(hwAAAAAwsQCE5wRABhGL6cNohYEQgwHG//8KGAkx/v8rxCiCgRHj) 转载于:https://www.cnblogs.com/nightnine/p/10499299.html

没学过编程能学python吗_无主之地2中这些拥有金钥匙的方法你知道吗?

许多朋友都喜欢玩无主之地2游戏&#xff0c;作为无主之地系列游戏的第二作&#xff0c;不仅是继承了前作精彩的玩法&#xff0c;还加入了许多新的元素&#xff0c;深受玩家们的喜爱。而在游戏里面&#xff0c;我们为了获得更多的福利和道具&#xff0c;都是需要拿到金钥匙的&am…

[NVIDIA实习]7月1日 无盘系统搭建 初尝3D vision

6月30日是第一天到达NVIDIA上海实习&#xff0c;本想写点什么&#xff0c;结果一天就理完了行政上的事情&#xff0c;熟悉了部门里的前辈&#xff0c;就被老板放了假&#xff0c;今天终于有点活干了。 7月1日&#xff1a; AM 10:04&#xff0c;老板说今天要教我搭无盘系统&…