洛谷P1164 小A点菜(01背包 计数问题)

P1164 小A点菜

题目描述

餐馆里有N种菜,每种菜价钱为ai,小A口袋里仅剩M元,需要将M元全部花光,共有多少种点菜方案;

输入格式

第一行是两个数字,表示N和M。(N<=100,M<=10000)

第二行起N个正数ai(可以有相同的数字,每个数字均在1000以内)。

输出格式

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

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
    int N,M,a[105],dp[10005];
    memset(dp,0,sizeof(0));
    dp[0]=1;//不点菜时也算一种方案;
    cin>>N>>M;
    for(int i=0;i<N;i++)
        cin>>a[i];
    sort(a,a+N);
    for(int i=0;i<N;i++)
    for(int j=M;j>=a[i];j--)//01背包问题要逆序遍历;
    {
        dp[j]+=dp[j-a[i]];
    }
    cout<<dp[M];
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/xuanzo/p/12200638.html
今日推荐