zoukankan      html  css  js  c++  java
  • P1164 小A点菜

    原题链接 https://www.luogu.org/problemnew/show/P1164

    此题是一道简单的动规问题 才学两天不是很熟练,我苦思冥想看着题解终于想出来了。

    主要的思路如下:

    我们可以用二维数组f【i】【v】来储存点第i道菜时已经花了v元的方案数,用一维数组jq【i】来储存第i道菜的价格,那么有如下三种情况:

    1.若jq【i】==v时,说明前面i-1道菜所花的钱的总和等于第i道菜的价钱,那么这时我们可以用第i道菜来代替前i-1道菜,这样的话方案数就多了一种,所以f【i】【v】=f【i-1】【v】+1;

    2.若jq【i】<v时,说明第i道菜的价钱小于前i-1道菜所花的钱,所以我们可以舍弃前面的某几道菜来买第i道菜,这样可以使得我们的方案数增加,那么这时我们可以选择是否买第i道菜,如果买,那么前i-1道菜就要花掉v-jq【i】的钱数;如果不买,那么前i-1道菜就要花掉v的钱数。

    根据分类加法原理得出:这种情况的总方案数就是两种情况的总和,即f【i】【v】=f【i-1】【v-jq【i】】+f【i-1】【v】;

    3.若jq【i】>v时,说明第i道菜的价钱大于前i-1道菜所花的钱的总和,所以我们不能买第i道菜,那么这时的方案数为前i-1道菜花v元钱的方案数,即f【i】【v】=f【i-1】【v】;

    弄完了状态转移方程,那么这个题解起来就游刃有余了,上代码!

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int main()
    {
    int n,m,f[101][5000]={0},jq[101];               //f数组表示第i道菜花了v元的方案数,jq数组存放每道菜的价钱
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    cin>>jq[i];
    for(int i=1;i<=n;i++)                                   //从1~n道菜
    {
    for(int v=1;v<=m;v++)
    {
    if(jq[i]==v) f[i][v]=f[i-1][v]+1;                        //核心代码,上面已经分析过了,不做过多解释  
    if(v>jq[i]) f[i][v]=f[i-1][v]+f[i-1][v-jq[i]];
    if(v<jq[i]) f[i][v]=f[i-1][v];
    }
    }
    cout<<f[n][m];                                             //最多方案数一定在最后的f【n】【m】里,因为后面的方案数是从前面一个个累积过来的
    return 0; 
    
    }
  • 相关阅读:
    基于UML和ASP.NET实现三层B/S结构系统开发
    通过避免下列 10 个常见 ASP.NET 缺陷使网站平稳运行(转)
    GOOGLE浏览器(已经可以下载啦)
    虽然很老,但是还是挺有用,而且经常要看。META
    ASP.NET保持用户状态的九种选择
    设计ASP.NET应用程序的七大绝招
    将更智能的 ASP.NET 文件下载体验内置到您的 Web 应用程序中 (MSDN)
    据说是民间最准确的算命法则
    ASP.NET是否是微软继MFC之后最无用的框架?
    宁波单身公寓出租
  • 原文地址:https://www.cnblogs.com/xcg123/p/10506765.html
Copyright © 2011-2022 走看看