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];
}