洛谷P1021 郵票面值設計 題解

2022-07-15 18:48:11 字數 1035 閱讀 6309

首先,看到這題,大家肯定首先想到暴力+dfs吧!

可是這題暴力會超時;

好吧我們還是來認真思考下正解

思路應該是列舉出所有種類的郵票,最後判斷一下,並記錄最大值

暴搜,不行的話,可以剪枝?

1.使a陣列保持單調遞增,dfs中每次從a[k-1]+1開始搜尋,以此來消除重複的搜尋;(常規思路)

2.a[1]=1;//每次肯定都要1這個面值的,可以思考一下,那麼直接從a[2]開始列舉;

思考乙個問題,dfs的列舉的下界已經清晰,可是上界該是多少呢?

這裡我們來舉個栗子吧~

假設當前準備填第k個(已經填好了k-1)個

前k-1個中可以湊出1-t中的所有整數(需要用dp求出t)

因此我們可以把上界定為t+1(而不是t,因為超過t+1就湊不出t+1,答案就沒法+1了)

也就是說

for(int j=a[k-1]+1;j<=end+1;j++)

//這裡的end就是由dp求出來前k-1湊出的答案;

誒?怎麼突然有了個dp出來(因為我們不知道前面的答案)

於是想到乙個dp[j]表示a陣列湊成j面值個數的最小值;

於是很容易得到

dp[j]=min(dp[j],dp[j-a[i]]+1);(dp[j-a[i]]//顯然現在的情況是小於等於n的;

初始化+oo,dp[0]=0;

code來啦!

#includeusing

namespace

std;

int n,m,maxx=0

;int dp[51000],ans[25],a[25

];int solve(int

k)void dfs(int

k)

return

; }

int end=solve(k-1

);

for(int j=a[k-1]+1;j<=end+1;j++)

}int

main()

//dp+dfs;

洛谷 P1021 郵票面值設計

要求乙個組合,很明顯是用dfs來搜尋,那麼怎麼判斷呢?用揹包!dp i 表示拼湊出 i 這個數的最小郵票數,然後統計dp i n 的個數即可 但是經過幾次嘗試就會發現,其上界值一定 當前最大的連續值,因為再大,就會出現 當前最大連續值 1 的空缺。上 include using namespace ...

洛谷P1021 郵票面值設計

一道奇怪的題目,考場不一定能想得出來 首先證明1的必要性,顯然,沒有1無法表示出1,因此1是必要的 有了1之後,就有了乙個列舉範圍,對於一種郵票,它的面值要比前乙個大。設前i 1種郵票能表示出來的最大範圍為up,那麼一定不能表示出up 1,所以第i種郵票的最大面值為up 1 複雜度未知,不過這種小資...

洛谷P1021郵票面值設計題解 zhengjun

題目描述 給定乙個信封,最多隻允許貼上n nn張郵票,計算在給定k kk n k 15 n k leq 15 n k 15 種郵票的情況下 假定所有的郵票數量都足夠 如何設計郵票的面值,能得到最大值max maxma x,使在1 11至max maxma x之間的每乙個郵資值都能得到。例如,n 3 ...