zoukankan      html  css  js  c++  java
  • 【洛谷 1164】小A点菜

    题目背景

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

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

    题目描述

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

    餐馆虽低端,但是菜品种类不少,有NN种(N le 100)(N≤100),第ii种卖a_ia
    i
    ​     元(a_i le 1000)(a
    i
    ​     ≤1000)。由于是很低端的餐馆,所以每种菜只有一份。

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

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

    输入输出格式

    输入格式:
    第一行是两个数字,表示NN和MM。

    第二行起NN个正数a_ia
    i
    ​     (可以有相同的数字,每个数字均在10001000以内)。

    输出格式:
    一个正整数,表示点菜方案数,保证答案的范围在intint之内。

    输入输出样例

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

    题解:来题水题压压惊。01背包就是选或者不选如果选当前的
    第i道,那么你要花的钱是a[i],f[j]表示使得总花费为j的方案数,现在因为j可以通过选第i道菜得到j+a[i]的价钱,所以f[j+a[i]]的方案数就要加上f[j]。

    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    typedef long long ll;
    using namespace std;
    int n,m,a[105],f[1005];
    int main(){
        scanf("%d %d",&n,&m);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        f[0]=1;
        for(int i=1;i<=n;i++){
            for(int j=m;j>=a[i];j--){
                f[j]+=f[j-a[i]];
            }
        }
        cout<<f[m];
        return 0;
    }
  • 相关阅读:
    欧拉公式
    isap的一些想法
    错误合集
    Hello World
    PAT (Advanced Level) Practice 1068 Find More Coins
    PAT (Advanced Level) 1087 All Roads Lead to Rome
    PAT (Advanced Level) 1075 PAT Judge
    PAT (Advanced Level) 1067 Sort with Swap(0, i)
    PAT (Advanced Level) 1017 Queueing at Bank
    PAT (Advanced Level) 1025 PAT Ranking
  • 原文地址:https://www.cnblogs.com/wuhu-JJJ/p/11139671.html
Copyright © 2011-2022 走看看