題目意思是你最多用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 ...