題意:給你n個菜,每個花費a[i]元,你有m元錢,你有多少種搭配方法使得這m元剛好用完?
思路:我們用f[i][j]表示前i個菜剛好花費j元的方案數,我們在狀態轉移的時候,先是繼承上一狀態,f[i][j]=max(f[i][j],f[i-1][j]),然後考慮如果j大於a[i],那麼就有f[i][j]+=f[i-1][j-a[i]],表示前i個菜花費j-a[i]元的方案數,這裡要注意開始的時候f[1~n][0]要置為1,因為j==a[i]的時候,方案要加1,我們還要把初始狀態f[1][a[1]]置為1。
**:
#include
#define endl '\n'
#define null null
#define ls p<<1
#define rs p<<1|1
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define ll long long
#define int long long
#define pii pair
#define ull unsigned long long
#define all(x) x.begin(),x.end()
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ct cerr<<"time elapsed:"<<1.0*clock()/clocks_per_sec<<"s.\n";
char
*fs,
*ft,buf[
1<<20]
;#define gc() (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<20,stdin),fs==ft))?0:*fs++;
inline
intread()
while
(ch>=
'0'&&ch<=
'9')
return x*f;
}using
namespace std;
const
int n=
1e5+5;
const
int inf=
0x7fffffff
;const
int mod=
998244353
;const
double eps=
1e-6
;const
double pi=
acos(-
1);int a[n]
,sum[n]
,f[105][
10005];
signed
main()
f[1]
[a[1]]
=1;for
(int i=
1;i<=n;i++
)for
(int i=
1;i<=n;i++)}
cout<[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元 ...
洛谷 P1164 小A點菜
uim神犇拿到了uoi的ra 鐳牌 後,立刻拉著 小a到了一家 餐館,很低端的那種。uim指著牆上的價目表 太低階了沒有選單 說 隨便點 不過uim由於買了一些輔 e 輔 ro 書,口袋裡只剩m元 m 10000 餐館雖低端,但是菜品種類不少,有n種 n 100 第i種賣ai元 ai 1000 由於...