点菜问题:动态规划(C语言实现)

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

目录

1.题目概述:

2.题目解析:

 3.题目代码:

4.样例展示:

5.题目总结: 


1.题目概述:

        某实验室经常有活动需要叫外卖,但是每次叫外卖报销的经费总额最大为C元,有N种菜可以点,经过长时间的点菜,实验室对每种菜i都有一个量化的评分Vi,这种菜的价格为Pi,问如何选择各种菜(每种菜只能点一次),才能在报销额度范围内使点到菜的总评价分数最高。

2.题目解析:

类似0/1背包,每个菜只能选或不选,且最多只能选一次
用dp[i][j]表示前i个菜金额为j时的最大评分,则dp[C][j]即为答案,初始化全0

由于每种菜最多只能选一次,为了避免重复计算某道菜,要在外层循环菜品
对应每种菜品,不选时,dp[j]不变
如果要选择,在金额 j 时,比较更新加入后的dp[j]
如果加入比原来评分高,那就加入并更新,否则就不加入保持原状
故得转移方程

dp[i][j] = max( dp[i-1][j] , dp[i-1][j-p[i]] + v[i])

由于每个菜品只循环了一次,所以不会重复
对每种菜品,在每个符合条件的价格处选择是否加入,所以每个价格处都是当前最优解,循环完就是全局最优解.

类似0/1背包问题,通过表格可以更能清晰的表达: 

点菜问题:动态规划(C语言实现)

 3.题目代码:

#include <stdio.h>
#include <math.h>
int max(int a, int b)
{
    if (a > b)
        return a;
    else
        return b;
}
int main()
{
    int n, C, i, j, k = 0;
    int temp;
    printf("请输入菜的种类个数:");
    scanf("%d", &n);
    printf("请输入外卖报销最大的经费数额:");
    scanf("%d", &C);
    int Vi[n], Pi[n], MaxValue[C + 1][n + 1], a[n];
    printf("请输入每种菜的量化评分:");
    for (i = 0; i < n; i++)
        scanf("%d", &Vi[i]);
    printf("请输入与之对应的每种菜的价格:");
    for (i = 0; i < n; i++)
        scanf("%d", &Pi[i]);
    for (i = 0; i < C + 1; i++)
        MaxValue[i][0] = 0;
    for (i = 0; i < n + 1; i++)
        MaxValue[0][i] = 0;
    for (j = 1; j <= n; j++)
    {
        for (i = 1; i <= C; i++)
        {
            if (Pi[j - 1] > i)
                MaxValue[i][j] = MaxValue[j - 1][i];
            else
                MaxValue[i][j] = max(MaxValue[i - Pi[j - 1]][j - 1] + Vi[j - 1], MaxValue[i][j - 1]);
        }
        if (MaxValue[i - 1][j] != MaxValue[i - 1][j - 1])
        {
            a[k] = j;
            k++;
        }
    }
    printf("选择的菜的种类为: ");
    for (i = 0; i < k; i++)
    {
        printf("第%d种 ", a[i]);
    }
    printf("\n");
    printf("点到菜的总评价分数为: %d\n", MaxValue[C][n]);
    return 0;
}

4.样例展示:

点菜问题:动态规划(C语言实现)

点菜问题:动态规划(C语言实现) 

5.题目总结: 

        此次实验重难点在于动态规划递归式的求解,以及动态规划表的构造。同时,二维数组的定义,应用和传值,我认为也是这次实验的一大难点。总结来说,在算法问题的设计上,采用递归式,构建动态规划表,不断的得到最优值是问题的关键。这是对该问题的简要分析。文章来源地址https://www.toymoban.com/news/detail-465468.html

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

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

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

相关文章

  • 动态规划算法解决背包问题,算法分析与C语言代码实现,时间效率解析

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

    2023年04月16日
    浏览(50)
  • 【四】【C语言\动态规划】地下城游戏、按摩师、打家劫舍 II,三道题目深度解析

    动态规划就像是解决问题的一种策略,它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题,并将每个小问题的解保存起来。这样,当我们需要解决原始问题的时候,我们就可以直接利用已经计算好的小问题的解,而不需要重

    2024年02月04日
    浏览(46)
  • 【七】【C语言\动态规划】最大子数组和、环形子数组的最大和、乘积最大子数组,三道题目深度解析

    动态规划就像是解决问题的一种策略,它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题,并将每个小问题的解保存起来。这样,当我们需要解决原始问题的时候,我们就可以直接利用已经计算好的小问题的解,而不需要重

    2024年02月03日
    浏览(46)
  • 【每日易题】Leetcode上Hard难度的动态规划题目——地下城游戏的实现

    君兮_的个人主页 即使走的再远,也勿忘启程时的初心 C/C++ 游戏开发 Hello,米娜桑们,这里是君兮_,博主最近一直在钻研动态规划算法,最近在Leetcode上刷题的时候遇到一个Hard难度的动态规划题,今天就借此机会来给大家分享一下我对这个题目的一些看法和解题思路(放心,

    2024年02月05日
    浏览(46)
  • C语言动态规划解决0-1背包问题

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

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

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

    2024年02月04日
    浏览(56)
  • 动态规划题目练习

    动态规划背包问题-CSDN博客 动态规划基础概念-CSDN博客 题目描述 棋盘上 A 点有一个过河卒,需要走到目标 B 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 C 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河

    2024年04月25日
    浏览(37)
  • 【算法】——动态规划题目讲解

    本期继续为大家带来的是关于动态规划类题目的讲解,对于这类题目大家一定要多加练习,争取掌握。 链接如下: 62. 不同路径 题目如下: 算法思路: 1. 状态表⽰:  对于这种「路径类」的问题,我们的状态表⽰⼀般有两种形式: i. 从 [i, j] 位置出发; ii. 从起始位置出发

    2024年02月10日
    浏览(42)
  • 动态规划2:题目

    目录 第1题 Fibonacci 第2题 字符串分割(Word Break) .第3题 三角矩阵(Triangle) 第4题 路径总数(Unique Paths) 第5题 最小路径和(Minimum Path Sum) 第6题 背包问题 第7题 回文串分割(Palindrome Partitioning) 第8题 编辑距离(Edit Distance) 第9题 不同子序列(Distinct Subsequences) 分析问题: 1. 状态定义F(i):第

    2024年02月06日
    浏览(43)
  • 【LeetCode】动态规划类题目详解

    所有题目均来自于LeetCode,刷题代码使用的Python3版本 如果某一个问题有重叠的子问题,则使用动态规划进行求解是最有效的。 动态规划中每一个状态一定是由上一个状态推导出来的,这一点区别于贪心算法 动态规划五部曲 确定dp数组以及下标的含义 确定递推公式 dp数组如何

    2024年04月11日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包