bzoj5018 Snoi2017 英雄聯盟

2021-08-07 20:24:05 字數 1338 閱讀 4212

description

正在上大學的小皮球熱愛英雄聯盟這款遊戲,而且打的很菜,被網友們戲稱為「小學生」。現在,小皮球終於受不

了網友們的嘲諷,決定變強了,他變強的方法就是:買**!小皮球只會玩n個英雄,因此,他也只準備給這n個英

雄買**,並且決定,以後只玩有**的英雄。這n個英雄中,第i個英雄有ki款**,**是每款ciq幣(同乙個

英雄的****相同)。為了讓自己看起來高大上一些,小皮球決定給同學們展示一下自己的**,展示的思路是

這樣的:對於有**的每乙個英雄,隨便選乙個**給同學看。比如,小皮球共有5個英雄,這5個英雄分別有0,0,

3,2,4款**,那麼,小皮球就有3*2×4=24種展示的策略。現在,小皮球希望自己的展示策略能夠至少達到m種,

請問,小皮球至少要花多少錢呢?

input

第一行,兩個整數n,m

第二行,n個整數,表示每個英雄的**數量ki

第三行,n個整數,表示每個英雄**的**ci

共 10 組資料,第i組資料滿足:n≤max(5,(log2i)^4) m≤10^17,1≤ki≤10,1≤ci≤199。保證有解

output

乙個整數,表示小皮球達到目標最少的花費。

sample input

3 24

4 4 4

2 2 2

sample output

題解 f[i][j]=前i個物品,消費了j元的最多方案數。

**

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define mod 20101009

#define ll long long

#define n 10000005

using

namespace

std;

inline

int read()

while(ch>='0'&&ch<='9')

return x*f;

}ll dp[125][250000];

int n,k[125],c[125],sum[125];

ll m;

int main()

}for (int i=0;i<=sum[n];i++) if (dp[n][i]==m) return

printf("%d",i),0;

}

bzoj5018 Snoi2017 英雄聯盟

題目 嗯,其實吧,還是算比較顯然的dp。f i j 表示前 i個英雄 用了j 元錢的最 多方案數 最後答 案就是滿 足f n j m最小 的j了。轉移方法,首先 肯定要 列舉i,然後列舉 當前買幾 個 j 再列舉 l表示f i l 從什 麼轉移過 來。注意 每次l 的上界是 當前買所 有 的 這樣,...

bzoj5018 Snoi2017 英雄聯盟

10.5重回bzoj。刷了這道揹包dp交了10次。不過這個真的是一道好題。也許是我dp太爛 由於錢數較小,容易想到,f i 表示花了i元所有的展示策略個數。然而在dp的時候卻有乙個問題,我們列舉買的 個數維護揹包時,有可能同乙個英雄不同 數疊乘,這樣就不對了,所以dp時先從後將更新的位置列舉出來,再...

BZOJ5018 Snoi2017 英雄聯盟

算算 n 的最大值,i 1 nk i c i 243552 這就可以直接上揹包了 最裸最暴力的那種 可以選擇滾動陣列,並不能減掉一維,因為在重複列舉 j 的時候除第一次列舉之外都會用到當前這一層的狀態 include include include include include includeus...