P1164 小A點菜(線性dp)

2021-10-06 12:19:35 字數 1618 閱讀 9126

題意:給你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 由於...