洛谷1164 小A點菜

2021-09-26 01:49:59 字數 1121 閱讀 3911

uim神犇拿到了uoi的ra(鐳牌)後,立刻拉著**小a到了一家……餐館,很低端的那種。

uim指著牆上的價目表(太低階了沒有選單),說:「隨便點」。

不過uim由於買了一些輔(e)輔(ro)書,口袋裡只剩m元(m≤10000)。

餐館雖低端,但是菜品種類不少,有n種(n≤100),第i種賣a i元(a i ≤1000)。由於是很低端的餐館,所以每種菜只有乙份。

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

由於小a肚子太餓,所以最多只能等待11秒。

第一行是兩個數字,表示n和m。

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

乙個正整數,表示點菜方案數,保證答案的範圍在int之內。輸入

4 4

1 1 2 2

輸出
3
這道題洛谷給出的演算法標籤是dp揹包,但是我的第一眼感覺確是dfs(感覺什麼題在我這都是dfs。。。)。觀察資料量,100,初步判斷dfs可行。

對於這道題來說,每種菜都只能點一次,問的是最後恰好把錢花光的點法有多少種,那麼我們可以遍歷這個陣列,對於後面的菜來說,點菜的種類肯定不包含前面的菜品,因為前面的在dfs的過程中已經和後面的菜搭配使用過,所以一定不會考慮原來的菜品,只要蒙著頭往前衝就ok了。不過在dfs的過程中還是要注意標記陣列,是否已經訪問過。做到這些,差不多就ok了這道題。

dfs部分**:

void

dfs(

int x,

int p)

}}

完整**:

#include

#include

using namespace std;

int a[

105]

=,n,m,vis[

105]

=,r=0;

void

dfs(

int x,

int p)}}

intmain()

printf

("%d\n"

,r);

return0;

}

洛谷 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元 ...

洛谷 P1164 小A點菜

uim神犇拿到了uoi的ra 鐳牌 後,立刻拉著 小a到了一家 餐館,很低端的那種。uim指著牆上的價目表 太低階了沒有選單 說 隨便點 不過uim由於買了一些輔 e 輔 ro 書,口袋裡只剩m元 m 10000 餐館雖低端,但是菜品種類不少,有n種 n 100 第i種賣ai元 ai 1000 由於...