牛牛去買球 思維 揹包

2021-09-27 10:03:55 字數 1597 閱讀 4389

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 524288k,其他語言1048576k

64bit io format: %lld

乙個人如果在他很小的時候就自己賺過錢,他的一生都會過得非常節儉,因為他知道財富來之不易.

作為乙個勤儉節約的好孩子,牛牛決定在生活中踐行這一原則.

有一天他想去商店買一些球來玩,他發現商店裡有n個盒子,每個盒子外面有一張標籤告訴你有ai個紅球,bi個藍球,需要ci的錢購買

但是由於店主是乙個粗心的人,他告訴你每個盒子球的總量是符合標籤的說明的,但是具體的種類可能會有如下偏差,比如可能有

(ai+1 ,bi-1),(ai, bi), (ai-1, bi+1)三種可能

牛牛 想要買至少k個同顏色的球,但是他又不想浪費錢.

幫他算算最少花多少錢買盒子能夠使得至少會有k個球是同色的

第一行輸入兩個整數n,k (1≤ n≤50, 1 ≤ k ≤ 10000)

第二行輸入n個整數表示a陣列

第三行輸入n個整數表示b陣列

第三行輸入n個整數表示c 陣列

1 ≤ ai,bi,ci ≤ 10000

輸出乙個整數,如果無法達成目的,輸出$-1$
示例1

複製

2 10

6 54 4

1 1

複製

2
示例2

複製

2 10

5 54 4

1 1

複製

-1
示例3

複製

1 9105

13

複製

13
示例4

複製

5 10

1 2 3 4 5

1 2 3 4 5

1 2 3 4 5

複製

10
示例5

複製

5 17

1 2 3 4 15

1 2 3 4 5

1 2 3 4 5

複製

9
思路:我們很容易把它轉換為揹包問題,揹包的容量為球的個數,揹包的價值為所取的價值,因為要求取的某種球的個數大於等於k,我們考慮兩種極限情況:①:每個盒子裡的紅球都是ai-1個;②:每個盒子裡的藍球都是bi-1個。因為dp[i]表示放了i個球所獲得的價值,因此我們就遍歷dp[k]到dp[20000-2](為什麼是這個數呢?因為最極限的情況是一共兩個盒子,盒子裡球的個數為10000-1),取最小值。但是這樣就可以了嗎?並不是,樣例1告訴你了錯誤之處。我們考慮最普遍的情況,什麼情況某個顏色的球一定有大於等於k個呢?答案是取的取球總數大於等於2k-1時,一定有乙個顏色的球個數大於等於k。因此我們就取這個盒子裡的球總數,不管其顏色。遍歷dp[2k-1]到dp[20000-2],取最小值。最終的最小值即答案。

#includeusing namespace std;

const int maxn=2e4+100;

const int inf=0x3f3f3f3f;

int a[55],b[55],c[55],dp[maxn];

int main()

牛牛的揹包問題

牛牛準備參加學校組織的春遊,出發前牛牛準備往揹包裡裝入一些零食,牛牛的揹包容量為w。牛牛家裡一共有n袋零食,第i袋零食體積為v i 牛牛想知道在總體積不超過揹包容量的情況下,他一共有多少種零食放法 總體積為0也算一種放法 輸入描述 輸入包括兩行 第一行為兩個正整數n和w 1 n 30,1 w 2 1...

牛牛的揹包問題

牛牛準備參加學校組織的春遊,出發前牛牛準備往揹包裡裝入一些零食,牛牛的揹包容量為w。牛牛家裡一共有n袋零食,第i袋零食體積為v i 牛牛想知道在總體積不超過揹包容量的情況下,他一共有多少種零食放法 總體積為0也算一種放法 牛牛準備參加學校組織的春遊,出發前牛牛準備往揹包裡裝入一些零食,牛牛的揹包容量...

牛牛的揹包問題

牛牛準備參加學校組織的春遊,出發前牛牛準備往揹包裡裝入一些零食,牛牛的揹包容量為w。牛牛家裡一共有n袋零食,第i袋零食體積為v i 牛牛想知道在總體積不超過揹包容量的情況下,他一共有多少種零食放法 總體積為0也算一種放法 輸入包括兩行 第一行為兩個正整數n和w,表示零食的數量和揹包的容量。第二行n個...