洛谷 P1490 買蛋糕 解題報告

2022-04-30 06:51:07 字數 1543 閱讀 6610

野貓過生日,大家當然會送禮物了(咳咳,沒送禮物的同志注意了哈!!),由於不知道送什麼好,又考慮到實用性等其他問題,大家決定合夥給野貓買乙個生日蛋糕。大家不知道最後要買的蛋糕的準確**,而只會給蛋糕估價,即要買乙個不超過多少錢的蛋糕。眾oier藉此發揮:能否用最少的錢幣數去湊成估價範圍內的所有價值,使得不管蛋糕價值多少,都不用找錢……

現在問題由此引出:對於乙個給定的n,能否用最少的不等的正整數去組成n以內(包括n)的所有的正整數呢?如果能,最少需要多少個正整數,用最少個數又有多少不同的組成方法呢?

只有一行包含乙個整數n(1<=n<=1000)。

一行兩個數,第乙個數是最少需要多少個數,第二個數是用最少個數的組成方案個數。兩個答案用空格分隔。

也許你可以打表看出來,也許不能,但別急,我們有看似靠譜一點的思維方法

看看樣例:6

可行方案:

①\(1\)

\(2\)

\(3\);

②\(1\)

\(2\)

\(4\).

我們發現,對於方案①,組成3的時候有兩種方法(1+2或3),而方案②只有一種。換而言之,3的利用是有浪費的。而不浪費的方案②還可以組成7。

那麼,我們咋讓她(每個數)都用好自己呢

很簡單,百合就行了

聯想一下二進位制位下的數

\(1\),\(10\),\(11\),\(100\),\(101\),\(110\),\(111\),\(1000\)...

可不是嘛,這個\(2^i\)的每個數利用率可高了

由此可知,二進位制的位數即為這個最小的正整數

當每個數的利用率最大的時候,她們能夠湊成的最大整數即為她們的和,這點是毋庸置疑的。

那麼,在利用率相對不是那麼大的時候呢?

我們注意到,此時已經有了乙個限制條件:已有的最小正整數

手動模擬一下,確實是仍然成立的。(其實是不太會證啦)

這時候,我們就把參與量已使用的各數之和湊成的最大整數搞到一起去了

考慮\(dp[k]\)代表湊成時\(k\)的方案數。看看這時候還要壓哪些資訊進去。

顯然,剩下的必要資訊還有第\(i\)個數和第\(i\)個數的值\(j\)

\(dp[i][j][k]\)表示已選\(i\)個數,第\(i\)個數為\(j\),前\(i\)個數和為\(k\)(湊成的最大整數字\(k\))的時候的方案數

轉移方程\(dp[i+1][l][k+l]+=dp[i][j][k];\)

其中\(l\)為列舉的下乙個填充數

核心**:

dp[1][1][1]=1;

for(int i=1;i注意\(j,k,l\)的上下界,都是被已經得到的第一問給約束住了

當然,也沒必要跑這麼死,比如\(k\)從\(i\)開始反而會快一些。

至於\(if\)和\(else\)的判斷,是為了方便求最後結果的一點點小貪心了。

2018.5.2

樹形DP 洛谷P1490 奶思

在這裡 第乙個 很巧妙 資料是 dfs 過後的資料 因為本來dfs就是一種遞迴 那麼就可以去遞迴的重新讀資料 重新 遞迴 dfs 但是時間效率不是很高 記憶化搜尋 另附 第二個時間效率更高的 巨佬的 include include include define maxn 1001 using nam...

洛谷P3372解題報告

題目描述如下 在這裡插入描述 由於是一道模板題就直接給注釋詳細的 include includeusing namespace std typedef long long ll long long int sum 0ll struct node tree 500005 void build ll l...

洛谷P1342 請柬解題報告

求去的路徑與回來的路徑和 1 n m 1000000 1 le n,m le 1000000 1 n,m 1000 000最短路 對於第一次碰到這種模型的oiers,這個地方可以講講的。顯然我們可以暴力跑n遍最短路。但是我們可以這麼想 我們出去是從乙個點到所有其他點,那麼我們能回來也從乙個點到所有其...