題解 洛古P6394 櫻花,還有你

2022-09-14 14:57:15 字數 959 閱讀 1296

同步於:

porblem

p6394

與擺花很相似。(其實就是擺花加強版)

大意

有k棵樹,每棵樹下有si朵花,求總和為n的方案數。可以在任意一棵樹下結束

此題dp與遞推的思路其實是差不多的,嚴格來說還是個dp題。本人就稍微講一下多重揹包的思路。

細讀題目,這不就是一道多重揹包嗎?此時我們將揹包容量看成櫻花數,那麼 fp 為摘p朵櫻花的方案數,那麼就可以直接做了。

for(i=1;i<=k;i++)//

前i棵樹

for(p=n;p>=0;p--)//

多重揹包轉換為01揹包

for(j=1;j<=min(s[i],p);j++)

f[p]=(f[p]+f[p-j])%10086001;

然而此時看一眼資料 1<=n,k<=5*103,顯然多重揹包 o(kn2) 的時間還是太耗時了,此時觀察第三層迴圈,

每次的 fp 都是加上乙個區間,所以可以直接用乙個字首和來計算,那麼第三層迴圈就可以省掉了。

最後附上 ac **,時間複雜度 o(nk)

#include#include

using

namespace

std;

const

int m=10086001

;int f[5001

];long

long s[5001];//

字首和int

num,ans;

intmain()

if(numcout

<<"

impossible";

else

cout

}

這道題主要還是多重揹包與字首和思想的結合,能學會善用即可。

題解 洛谷 P6394 櫻花,還有你

直接考慮 dp。令 dp i j 表示到第 i 棵櫻花樹,摘了 j 片櫻花的可能方案數。轉移方程很顯然,就是列舉在每個樹下摘的幾片櫻花 dp i j sum dp i 1 j k 發現只有上一次會產生影響,所以把 i 滾動掉可以得到 80pts。includeusing namespace std ...

題解 洛谷P1445 Violet 櫻花

題面 我們首先對題目中的式子進行化簡 begin frac frac frac y times n x times n xy x n times y x times n y frac frac frac frac frac n frac end 因為 x 和 y 都是正整數,所以 frac 也一定是...

洛古P1036 選數 題解

我是傳送門 這是一道很經典的深搜與回溯 難度一般 可是就這個 普及 讓本蒟蒻做了一晚上 半個上午 實際我不會深搜回溯,全靠框架 去重 下面讓我分享下本蒟蒻的 全排列 暴搜去重 includeusing namespace std int n,r,ttt n是總數,r是選的數,ttt是答案 int a...