P1164 小A點菜

 

題目背景

uim神犇拿到了uoira(鐳牌)後,立刻拉着基友小A到了一家……餐館,很低端的那種。

uim指着牆上的價目表(太低級了沒有菜單),說:“隨便點”。

題目描述

不過uim由於買了一些輔(e)輔(ro)書,口袋裏只剩MMM元(M≤10000)(M \le 10000)(M≤10000)。

餐館雖低端,但是菜品種類不少,有NNN種(N≤100)(N \le 100)(N≤100),第iii種賣aia_iai​元(ai≤1000)(a_i \le 1000)(ai​≤1000)。由於是很低端的餐館,所以每種菜只有一份。

小A奉行“不把錢吃光不罷休”,所以他點單一定剛好吧uim身上所有錢花完。他想知道有多少種點菜方法。

由於小A肚子太餓,所以最多隻能等待111秒。

輸入格式

第一行是兩個數字,表示NNN和MMM。

第二行起NNN個正數aia_iai​(可以有相同的數字,每個數字均在100010001000以內)。

輸出格式

一個正整數,表示點菜方案數,保證答案的範圍在intintint之內。

輸入輸出樣例

輸入 #1

4 4
1 1 2 2

輸出 #1

3


又一道01揹包,對於每個菜,可以選擇點或不點,dp[i]表示花費i可行的方案數

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>
#include <map>
#define sf(a) scanf("%d\n",&a)
#define rep(i,a,b) for(i=a;i<=b;i++)
#define e 1e-8
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;
const int idata=1e3+5;

int i,j,k;
int judge,flag,temp;
//vector<ll>step(idata);
ll step[idata];
int dp[idata];
//int valu[30],wigh[30];
ll n,m,t,x,y;
ll maxx=-inf,minn=inf;
ll cnt,len,ans,sum;
priority_queue< int, vector<int> , greater<int> >q;
string s;

int main()
{
    while(cin>>n>>m)
    {
        for(i=1;i<=n;i++)
            cin>>step[i];

        dp[0]=1;//點某個菜時,剛好剛好花費完
        for(i=1;i<=n;i++)
        {
            for(j=m;j>=step[i];j--)
            {
                dp[j]+=dp[j-step[i]];
            }
        }
        cout<<dp[m]<<endl;
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章