P1021 郵票面值設計 搜尋 完全揹包

2022-03-16 13:57:28 字數 1032 閱讀 6410

題目意思是你最多用n張郵票,你可以自己設定k種郵票的面值,每種郵票數量無窮,你最多能用這k種郵票在不超過n張的情況下,組合成的價值要求是從1開始連續的,

求最大能連續到多少;

有完全揹包揹包的身影,我們知道每個物品的重量是1,但是我們不知道每個物品的價值是多少,這需要我們列舉;

我們如何列舉?

對於當前第x種郵票,它能賦予的值得範圍是什麼?

顯然我們不能賦值前面已經使用過的數,我們需要的是讓連續的最大數增長;

那就是前乙個數+1,但是不能超過前面使用過的數能表示的最大值+1。否則表示的數是不連續的;

因為前面的數連續最大能表示mx,再加乙個mx+2或者更大的數是不能表示mx+1的;

加上我們剛賦值的數能表示的最大值是多少?

完全揹包解決問題;

設f[j]表示價值為j時最少用幾張郵票;

然後從1開始遍歷到a[now]*now(能表示的最大值,雖然可能達不到),再判斷一下邊界n就好了;

#include#include

#include

using

namespace

std;

const

int maxn=1e5+10

;int

n,k;

intf[maxn];

int mon[20],ans[20

],ans_mx;

int dp(int x,int

mx) }

for(int i=1;i<=mon[x]*n;i++)

return mon[x]*n;

}void dfs(int x,int

mx)

return

; }

for(int i=mon[x-1]+1;i<=mx+1;i++)

}int

main()

printf("\n

");printf(

"max=%d\n

",ans_mx);

return0;

}

p1021 郵票面值設計

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

P1021 郵票面值設計

給定乙個信封,最多隻允許貼上n張郵票,計算在給定k n k 15 種郵票的情況下 假定所有的郵票數量都足夠 如何設計郵票的面值,能得到最大值max,使在1 max之間的每乙個郵資值都能得到。例如,n 3,k 2,如果面值分別為1分 4分,則在1分 6分之間的每乙個郵資值都能得到 當然還有8分 9分和...

洛谷 P1021 郵票面值設計

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