动态规划实现找零钱问题(C/++语言)

这篇具有很好参考价值的文章主要介绍了动态规划实现找零钱问题(C/++语言)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

设一硬币系统有n种面值,第i种硬币的面值和重量分别为pi​和wi​,硬币面值的单位为元,且有p1​<p2​<⋯<pn​和p1​=1,现需要给别人找Y∈Z+元钱,试确定一找零钱方案,使得所找的硬币的总重量最轻。

要求使用如下动态规划思想

设Fk​(y)表示使用前k种硬币去找y元钱时所找硬币的最轻总重量,则Fk​(y)的递推方程定义如下:
Fk​(y)=⎩⎨⎧​0≤xk​≤⌊pk​y​⌋min​{xk​⋅wk​+Fk−1​(y−xk​⋅pk​)},y⋅w1​,​k>1k=1​

设xk​(y)表示Fk​(y)取得最小值时第k种硬币所找的硬币数xk​,为了能够方便构造最优解,需要每算出一个Fk​(y)时,记录一下对应的xk​(y)。

输入格式:

输入共三行正整数,具体要求如下:

  • 第1行输入两个正整数,以一个空格隔开,分别代表硬币种数n和要找的钱数Y
  • 第2行输入n个正整数,以一个空格隔开,分别代表n种硬币的面值。要求:n种硬币的面值必须呈现单调递增,且第1种硬币的面值必须是1
  • 第3行输入n个正整数,以一个空格隔开,分别代表n种硬币的重量

输出格式:

输出两行,具体要求如下:

  • 第1行输出每种面值所找的硬币数,以一个空格隔开
  • 第2行输出所找硬币的总重量

输入样例: 4 28
                1 5 14 18
                1 1 1 1

 输出样例: 0 0 2 0
                  2

代码:

#include<stdio.h>
#include<stack>
using namespace std;
#define maxn 1010
int n, y;
int p[maxn], w[maxn], F[maxn][maxn], x[maxn][maxn];

int main(){
    scanf("%d%d", &n, &y);
    for(int i=1; i<=n; i++){
        scanf("%d", &p[i]);
    }
    for(int i=1; i<=n; i++){
        scanf("%d", &w[i]);
    }
    for(int i=0; i<=y; i++){
        F[1][i] = i*w[1];
        x[1][i] = i;
    }
    for(int i=2; i<=n; i++){
        F[i][0] = 0;
        x[i][0] = 0;
    }
    for(int k=2; k<=n; k++){
        for(int j=1; j<=y; j++){
            int m = j/p[k];
            F[k][j] = F[k-1][j-m*p[k]]+m*w[k];
            x[k][j] = m;
            for(int i=0; i<m; i++){
                int a=i*w[k]+F[k-1][j-i*p[k]];
                if(a<F[k][j]){
                    F[k][j] = a;
                    x[k][j] = i;
                }
            }
        }
    }
    stack<int> st;
    int Y=y, k=n;
    while(1){
        if(!k){
            break;
        }
        st.push(x[k][y]);
        y -= x[k][y]*p[k];
        k--;
    }    
    printf("%d", st.top());
    st.pop();
    while(st.size()){
        printf(" %d", st.top());
        st.pop();
    }
    printf("\n%d", F[n][Y]);
    return 0;
}文章来源地址https://www.toymoban.com/news/detail-773749.html

到了这里,关于动态规划实现找零钱问题(C/++语言)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《程序员面试金典(第6版)》 面试题 08.11. 硬币(动态规划,组合问题,C++)

    硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007) 示例1: 输入: n = 5 输出:2 解释: 有两种方式可以凑成总金额: 5=5 5=1+1+1+1+1 示例2: 输入: n = 10 输出:4 解释: 有四种方式可以凑成总金额: 1

    2023年04月08日
    浏览(44)
  • 点菜问题:动态规划(C语言实现)

    目录 1.题目概述: 2.题目解析:  3.题目代码: 4.样例展示: 5.题目总结:          某实验室经常有活动需要叫外卖,但是每次叫外卖报销的经费总额最大为C元,有N种菜可以点,经过长时间的点菜,实验室对每种菜i都有一个量化的评分Vi,这种菜的价格为Pi,问如何选择

    2024年02月07日
    浏览(27)
  • 【动态规划】基础DP--硬币组合

    动态规划(Dynamic Programming,DP)一般是多阶段决策问题,把一个复杂问题分解为相对简单的子问题,再一一解决,得到原复杂问题的最优解。 求解DP问题的步骤:定义状态、状态转移、算法实现。 DP问题可以分为线性和非线性的。 线性DP。线性DP有两种方法:顺推与逆推。在

    2024年02月07日
    浏览(26)
  • Problem P09. [算法课动态规划] 换硬币

    这将会是一个系统性的算法学习专栏,编程语言为C++,适用于刚开始学算法的学生和博友,建议需要的朋友收藏订阅,是免费的,希望对大家能够有所帮助。 动态规划当前状态和之前状态息息相关。比如这题:组成硬币,已经组成好的硬币x加上面值为y的硬币就可以组成好

    2024年02月22日
    浏览(27)
  • 动态规划算法解决背包问题,算法分析与C语言代码实现,时间效率解析

    🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨,经典算法的解析✨都在这儿,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏 🪔本系列专栏 -  数据结构与算法_勾栏听曲_0 🍻欢迎大家  🏹  点赞👍  评论📨  收藏⭐️ 📌个人主

    2023年04月16日
    浏览(41)
  • C语言动态规划解决0-1背包问题

    动态规划(Dynamic Programming,简称DP)是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题,它能够将问题分解为相互独立的子问题,并将子问题的解存储

    2024年04月28日
    浏览(31)
  • 贪心算法解决背包问题和动态规划解决0-1背包问题(c语言)

    运行结果如下: 运行结果如下: 总结: 贪心算法: 每一步都做出当时看起来最佳的选择,也就是说,它总是做出局部最优的选择。 贪心算法的设计步骤: 对其作出一个选择后,只剩下一个子问题需要求解。 证明做出贪心选择后,原问题总是存在最优解,即贪心选择总是安

    2024年02月04日
    浏览(41)
  • 0-1背包问题(Knapsack Problem)-动态规划方法(C语言递归和迭代)

    前言 背包0-1问题属于典型的求最大/最小子集问题范畴,它不像rod-cutting或matrix-chain-multiplication等问题,求解过程是按照单位等增或单位递减,0-1背包问题属于在集合范围内的某一个值,而且这些值大概率不是连续值。 问题描述 假定有N件物品,每件物品具有特定的价值value

    2024年02月06日
    浏览(31)
  • 动态规划——01背包问题(C++实现)

    整体思路: 利用动态规划,其目的就是将原问题分解成几个子问题,通过求解简单的子问题,把原问题给解决,就比如斐波那契数列方程: f[i]=f[i-1]+f[i-2]; 动态规划的核心就是找到原问题与子问题的关系,并列出动态转移方程。 实现方法: 这里我们可以定义一个二维数组,

    2024年02月11日
    浏览(41)
  • 零钱兑换(Coins Change) -动态规划C语言实现

    1. 前言 零钱兑换是经典的动态规划问题,也是贪心解法不足的反证答案。它要求兑换一定总整数的零钱,满足硬币数量最少的条件。假定我们有3类零钱,构成数组coins[]={1,7,10},现在兑换总额14的金额,如果采用贪心策略,我们有10+1+1+1+1=14, 共需要5枚硬币。实际上本题的最少

    2024年02月09日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包