noip1999 郵票面值設計 (搜尋 完全揹包)

2021-07-04 14:49:01 字數 1322 閱讀 7916

a1123. 郵票面值設計

時間限制:

1.0s   記憶體限制:

256.0mb

總提交次數:

324ac次數:

103   平均分:

49.85

將本題分享到:

檢視未格式化的試題

提交試題討論

試題**

noip1999 提高組

問題描述

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

輸入格式

一行,兩個數n、k

輸出格式

兩行,第一行公升序輸出設計的郵票面值,第二行輸出「max=xx」(不含引號),其中xx為所求的能得到的連續郵資最大值。

樣例輸入

3 2樣例輸出

1 3max=7

解析:①搜尋。對每一步,列舉郵票面值,然後搜尋下一張郵票面值並更新最優解。

②完全揹包確定搜尋範圍。

假設現在列舉到第 i 張郵票面值,第 i-1 張郵票面值為a[i-1],前 i-1 張郵票得到的最大連續值為x,則第 i 張郵票面值的範圍就為 [a[i-1]+1,x+1];

假設現在有 n 張郵票,怎麼得到其最大連續值呢?

用 f[i] 記錄達到數值 i 所需的最小郵票數量,初始化為乙個極大值。然後用完全揹包算出 f[i] 的值,從 0 開始,第乙個f[i]>n,則 i-1 就為最大連續值。

**:#include#include#includeusing namespace std;

const int maxn1=40;

const int maxn2=10000;

int n,m,ans=0,f[maxn1][maxn2];

int a[maxn1+20],b[maxn2+20];

void dfs(int step,int s,int e) }}

int main()

{ int i;

memset(f[1],25,sizeof(f[1]));

scanf("%d%d",&n,&m);

for(i=0;i<=n;i++)f[1][i]=i;

a[1]=1,dfs(2,2,n+1);

for(i=1;i

NOIP1999郵票面值設計

noip1999郵票面值設計 題目描述 description 給定乙個信封,最多隻允許貼上n張郵票,計算在給定k n k 40 種郵票的情況下 假定所有的郵票數量都足夠 如何設計郵票的面值,能得到最大值max,使在1 max之間的每乙個郵資值都能得到。例如,n 3,k 2,如果面值分別為1分 4分...

NOIP1999 郵票面值設計

時間限制 1 sec 記憶體限制 64 mb 提交 131 解決 63 提交 狀態 我的提交 給定乙個信封,最多隻允許貼上n張郵票,計算在給定k n k 40 種郵票的情況下 假定所有的郵票數量都足夠 如何設計郵票的面值,能得到最大值max,使在1 max之間的每乙個郵資值都能得到。第1行 2個整數...

郵票面值設計(NOIP1999)

傳送門 怎麼講呢?挺有意思的 是一道dp和搜尋的結合。我們把數字從小到大依次列舉。用dp去計算當前的所得最大值。f i 表示湊成i面值所需的最小郵票數量。那麼小於等於n的,都是可以湊出來的。那麼最大值也就好求了。至於dp的上界,用幾個數的和就能解決。如下 include include includ...