洛谷p1164

P1164 小A點菜

題目描述

uim口袋裏有剩M元(M<=10000)。

餐館雖低端,但是菜品種類不少,有N種(N<=100),第i種賣ai元(ai<=1000)。由於是很低端的餐館,所以每種菜只有一份。

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

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

輸入輸出格式

輸入格式: 第一行是兩個數字,表示N和M。

第二行起N個正數ai(可以有相同的數字,每個數字均在1000以內)。

輸出格式: 一個正整數,表示點菜方案數。

輸入輸出樣例

輸入樣例#1: 4 4 1 1 2 2 輸出樣例#1: 3

設f[i][j]表示前i道菜,剩餘j元時的最大方案數。
則f[i][0] = 1->沒錢的時候什麼都不買,這也算是一種方案。
那麼f[i][j] = f[i-1][j-cost[i]]。
去掉前一個數組f[j] = f[j-cost[i]]

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n,m,cost;
int f[1001];
int main(){
    scanf("%d%d",&n,&m);
    memset(f,0,sizeof(f));
    f[0] = 1;
    for (int i =1;i<=n;i++){
        scanf("%d",&cost);
        for (int j = m;j>=cost;j--){
            f[j]+=f[j-cost];
            }
        }
    cout<<f[m];
}
發佈了41 篇原創文章 · 獲贊 10 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章