洛谷1021 郵票面值設計

2021-07-07 05:12:34 字數 1060 閱讀 8700

給定乙個信封,最多隻允許貼上n張郵票,計算在給定k(n+k≤40)種郵票的情況下(假定所有的郵票數量都足夠),如何設計郵票的面值,能得到最大值max,使在1~max之間的每乙個郵資值都能得到。

例如,n=3,k=2,如果面值分別為1分、4分,則在1分~6分之間的每乙個郵資值都能得到(當然還有8分、9分和12分);如果面值分別為1分、3分,則在1分~7分之間的每乙個郵資值都能得到。可以驗證當n=3,k=2時,7分就是可以得到的連續的郵資最大值,所以max=7,面值分別為1分、3分。輸入格式:

2個整數,代表n,k。

輸出格式:

2行。第一行若干個數字,表示選擇的面值,從小到大排序。

第二行,輸出「max=s」,s表示最大的面值。

輸入樣例#1:

3 2
輸出樣例#1:

1 3

max=7

分析:連續郵資問題,這題資料範圍有點怪。。最壞情況顯然過不了但還是ac了。

人家總結的很好了。by d_double

我用搜尋+剪枝寫法,搜尋出now[1..k],表示取這k種面值時能得到最大連續郵資,第i種面值搜尋範圍最小now[i-1]+1,最大是update(最大連續郵資)+1。

update函式更新用now[1..i]的面值取n個時能得到的最大連續郵資,只要搜尋出所有組合就可以了。

#include#include#include#define maxn 50

int n,k,kind,ans[maxn],now[maxn],max,x,maxans=0;

_bool vis[1000];

void dfs_n(int num,int sum,int prev) }

int update(int x)//得到當前郵票種類集合的最大連續值

void dfs_k(int step,int best)//搜尋面值種類方案

return;

} int i;

for(i=now[step-1]+1;i<=best+1;i++)//下一種面值 }

int main(void)

洛谷 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 郵票面值設計 題解

首先,看到這題,大家肯定首先想到暴力 dfs吧!可是這題暴力會超時 好吧我們還是來認真思考下正解 思路應該是列舉出所有種類的郵票,最後判斷一下,並記錄最大值 暴搜,不行的話,可以剪枝?1.使a陣列保持單調遞增,dfs中每次從a k 1 1開始搜尋,以此來消除重複的搜尋 常規思路 2.a 1 1 每次...