uim
神犇拿到了uoi
的ra
(鐳牌)後,立刻拉著**小a
到了一家……餐館,很低端的那種。
uim
指著牆上的價目表(太低階了沒有選單),說:「隨便點」。
不過uim
由於買了一些輔(e)輔(ro)書
,口袋裡只剩m元(m≤10000)。
餐館雖低端,但是菜品種類不少,有n種(n≤100),第ii種賣ai元(ai≤1000)。由於是很低端的餐館,所以每種菜只有乙份。
小a
奉行「不把錢吃光不罷休」,所以他點單一定剛好吧uim
身上所有錢花完。他想知道有多少種點菜方法。
由於小a
肚子太餓,所以最多只能等待11秒。
輸入格式:
第一行是兩個數字,表示n和m。
第二行起n個正數ai(可以有相同的數字,每個數字均在1000以內)。
輸出格式:
乙個正整數,表示點菜方案數,保證答案的範圍在int之內。
輸入樣例#1:複製
4 4
1 1 2 2
輸出樣例#1:複製
3
定義f[i][j]為用前i道菜用光j元錢的辦法總數,其狀態轉移方程如下:
(1)if(j==第i道菜的**)f[i][j]=f[i-1][j]+1;
(2)if(j>第i道菜的**) f[i][j]=f[i-1][j]+f[i-1][j-第i道菜的**];
(3)if(j《第i道菜的**) f[i][j]=f[i-1][j];
說的簡單一些,這三個方程,每乙個都是在吃與不吃之間抉擇。若錢充足,辦法總數就等於吃這道菜的辦法數與不吃這道菜的辦法數之和;若不充足,辦法總數就只能承襲吃前i-1道菜的辦法總數。依次遞推,在最後,我們只要輸出f[n][m]的值即可。
#include#include#includeusing namespace std;
int a[101],f[101][10001]=;
int main()
cout
}
01揹包模型P1164 小A點菜
一定要注意 在不同的條件之下,dp陣列代表的含義不同,一般是問題問的元素。題目背景 uim神犇拿到了uoi的ra 鐳牌 後,立刻拉著 小a到了一家 餐館,很低端的那種。uim指著牆上的價目表 太低階了沒有選單 說 隨便點 題目描述 不過uim由於買了一些輔 e 輔 ro 書,口袋裡只剩mmm元 m ...
洛谷 P1164 小A點菜
不過uim由於買了一些輔 e 輔 ro 書,口袋裡只剩m元 m 10000 餐館雖低端,但是菜品種類不少,有n種 n 100 第i種賣ai元 ai 1000 由於是很低端的餐館,所以每種菜只有乙份。小a奉行 不把錢吃光不罷休 所以他點單一定剛好吧uim身上所有錢花完。他想知道有多少種點菜方法。由於小...
洛谷P1164 小A點菜
題目背景 uim神犇拿到了uoi的ra 鐳牌 後,立刻拉著 小a到了一家 餐館,很低端的那種。uim指著牆上的價目表 太低階了沒有選單 說 隨便點 題目描述 不過uim由於買了一些輔 e 輔 ro 書,口袋裡只剩m元 m 10000 餐館雖低端,但是菜品種類不少,有n種 n 100 第i種賣ai元 ...