P1021 郵票面值設計

2022-05-13 13:01:29 字數 1423 閱讀 4386

給定乙個信封,最多隻允許貼上n張郵票,計算在給定k(n+k≤15)種郵票的情況下(假定所有的郵票數量都足夠),如何設計郵票的面值,能得到最大值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

寫了個dp,寫了個深搜結果慢的和烏龜一樣。。

不過幸虧有資料,

思路:深搜列舉,揹包dp求值

1 #include2 #include3 #include4 #include5

using

namespace

std;

6const

int maxn=1001;7

void read(int &n)812

while(c>='

0'&&c<='9'

)13

14 flag==1?n=-x:n=x;15}

16int

n,k;

17bool

vis[maxn];

18int ans[maxn];//

每一次選的數

19int dp[maxn];//

記錄每乙個數是否有方案可以達到

20int

maxnum;

21int

out[maxn];

22int ed=0

;23 inline int

pd()

24

42else

break;43

}44return

ok;45

}46 inline void dfs(int now,int num)//

now已經選的數量,num最後一數

4762

return;63

}64for(int i=num+1;i<=51&&i<=n*num+5;i++)

6573

else

747980}

81}82int

main()

83

p1021 郵票面值設計

題目連線 正常的搜尋是不容易搜尋到答案的,因為無法確定最大的內個max值。但是我們可以這樣考慮,首先搜尋的範圍是遞增的。這個範圍的下界是上乙個數 1,上界的確定,考慮揹包問題。d i 代表拼成i最少的數是多少個。因此搜尋到答案後,我們對d i 進行計算就可以得到最大能拼成的值。include inc...

洛谷 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 複雜度未知,不過這種小資...