P1077 擺花(線性dp)

2021-10-05 13:12:05 字數 1505 閱讀 4131

題意:給你n個種花,每一種花的不能超過a[i]盆,總共需要m盆,問你方案數對1000007取模的結果。

思路:我們用乙個二維陣列f[n][n],f[i][j]表示前i種花,用j盆,有f[i][j]種方案,假如我們第i種花取j盆,那麼我們由之前有的k盆轉移過來,方程為f[i][j+k]+=f[i-1][k]。j最大取a[i],k最大取m-j。(明顯f[0][0]=f[1][0]=…=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 vi vector

#define mii map

#define pii pair

#define ull unsigned long long

#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=

2e5+5;

const

int inf=

0x7fffffff

;const

int mod=

1e9+7;

const

double eps=

1e-6

;int a[n]

,dp[

105]

[105];

signed

main()

dp[0]

[0]=

1;for(

int i=

1;i<=n;i++)}

} cout<[m]<}

P1077 擺花 dp 搜尋)

傳送門 思路 dpdp dp的經典題,若沒有思路先嘗試爆搜,會t tt掉,然後記憶化一下就可以acac ac,當然能用記憶化搜尋,肯定也能dpdp dp了,最後根據別的大佬的推出來是01 0101 揹包。tql tqltq l 搜尋 include using namespace std typed...

P1077 擺花 揹包DP

小明的花店新開張,為了吸引顧客,他想在花店的門口擺上一排花,共m盆。通過調查顧客的喜好,小明列出了顧客最喜歡的n種花,從1到n標號。為了在門口展出更多種花,規定第iii種花不能超過 a i 盆,擺花時同一種花放在一起,且不同種類的花需按標號的從小到大的順序依次擺列。試程式設計計算,一共有多少種不同的...

擺花 洛谷p1077

小明的花店新開張,為了吸引顧客,他想在花店的門口擺上一排花,共m盆。通過調查顧客的喜好,小明列出了顧客最喜歡的n種花,從1到n標號。為了在門口展出更多種花,規定第i種花不能超過ai盆,擺花時同一種花放在一起,且不同種類的花需按標號的從小到大的順序依次擺列。試程式設計計算,一共有多少種不同的擺花方案。...