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

    题目背景

    uim神犇拿到了uoira(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种。

    uim指着墙上的价目表(太低级了没有菜单),说:“随便点”。

    题目描述

    不过uim由于买了一些辅(e)辅(ro)书,口袋里只剩MMM(M≤10000)(M le 10000)(M10000)

    餐馆虽低端,但是菜品种类不少,有NNN(N≤100)(N le 100)(N100),第iii种卖aia_iai(ai≤1000)(a_i le 1000)(ai1000)。由于是很低端的餐馆,所以每种菜只有一份。

    小A奉行“不把钱吃光不罢休”,所以他点单一定刚好吧uim身上所有钱花完。他想知道有多少种点菜方法。

    由于小A肚子太饿,所以最多只能等待111秒。

    输入输出格式

    输入格式:

    第一行是两个数字,表示NNNMMM

    第二行起NNN个正数aia_iai(可以有相同的数字,每个数字均在100010001000以内)。

    输出格式:

    一个正整数,表示点菜方案数,保证答案的范围在intintint之内。

    输入输出样例

    输入样例#1: 复制
    4 4
    1 1 2 2
    
    输出样例#1: 复制
    3

    题解:
    类似0-1背包要求完全装满。dp[i][j]表示考虑前i道菜,总金额为j的方案数目,空间优化后用一维数组dp[j]代替
    递推方程:
      dp[i][j]=dp[i-1][j]+dp[i-1][j-a[j]]
    表示对第i道菜做决策时,总方案数等于买第i道和不买第i道方案数之和。但注意只有恰好花完所有钱的方案才可以选择(用初始化负无穷实现)。
    空间优化后为一维数组dp[]
    初始化dp[0]=1(思考这样做的合理性)dp[k]=inf (k!=0)
    #include<cstdio>
    #include<algorithm>
    #include<queue>
    using namespace std;
    
    
    int    m,n;
    const int maxn=107;
    const int maxm=10007;
    const int inf=-0x3f3f3f3f;
    int a[maxn];
    int dp[maxm];
    int main(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        for(int i=1;i<=m;i++)
            dp[i]=inf;
        dp[0]=0;
        for(int i=m;i>=0;i--){
            if(i-a[i]>=0)
                if(dp[i]>=0&&dp[i-a[i]]>=0)
                    dp[i]=dp[i]+dp[i-a[i]];
                else
                    dp[i]=max(dp[i],dp[i-a[i]]);
    
        }
        printf("%d
    ",dp[m] );
    
    }
    
    
    
     
  • 相关阅读:
    Composite in Javascript
    Model Validation in Asp.net MVC
    HttpRuntime.Cache vs. HttpContext.Current.Cache
    Controller Extensibility in ASP.NET MVC
    The Decorator Pattern in Javascript
    The Flyweight Pattern in Javascript
    Model Binding in ASP.NET MVC
    Asp.net MVC
    jQuery Ajax 实例 全解析
    ASP.NET AJAX入门系列
  • 原文地址:https://www.cnblogs.com/loganlzj/p/10365232.html
Copyright © 2011-2022 走看看