組合型揹包(整除取模) 糖果

2021-10-25 20:19:40 字數 1605 閱讀 3218

由於在維護世界和平的事務中做出巨大貢獻,dzx被贈予糖果公司2023年5月23日當天無限量糖果免費優惠券。

在這一天,dzx可以從糖果公司的 n 件產品中任意選擇若干件帶回家享用。

糖果公司的 n 件產品每件都包含數量不同的糖果。

dzx希望他選擇的產品包含的糖果總數是 k 的整數倍,這樣他才能平均地將糖果分給幫助他維護世界和平的夥伴們。

當然,在滿足這一條件的基礎上,糖果總數越多越好。

dzx最多能帶走多少糖果呢?

注意:dzx只能將糖果公司的產品整件帶走。

輸入格式

第一行包含兩個整數 n 和 k。

以下 n 行每行 1 個整數,表示糖果公司該件產品中包含的糖果數目,不超過 1000000。

輸出格式

符合要求的最多能達到的糖果總數,如果不能達到 k 的倍數這一要求,輸出 0。

資料範圍

1≤n≤100

,1≤k≤100

,

輸入樣例:

571

2345

輸出樣例:

14
樣例解釋

dzx的選擇是2+3+4+5=14,這樣糖果總數是7的倍數,並且是總數最多的選擇。

定義狀態為f[i

][j]

f[i][j]

f[i][j

]表示從前i個物品裡選,%k為j的方案

屬性:max

目標:f[n][0]

狀態轉移

f [i

][j]

=max

(f[i

−1][

j−1]

,f[i

−1][

(j−a

[i]%

k+k)

%k)+

w[i]

)f[i][j]=max(f[i-1][j-1],f[i-1][(j-a[i]\%k+k)\%k)+w[i])

f[i][j

]=ma

x(f[

i−1]

[j−1

],f[

i−1]

[(j−

a[i]

%k+k

)%k)

+w[i

])注意上面式子裡的取模運算,防止出現負數

#include

using

namespace std;

int t,n;

const

int n=

110,inf=

0x3f3f3f3f

;typedef

long

long ll;

int a[n]

,f[n]

[n];

intmain()

}printf

("%d"

,f[n][0

]);return0;

}

01揹包(多個揹包的組合)

kkksc03的大學生活非常的頹廢,平時根本不學習。但是,臨近期末考試,他必須要開始抱佛腳,以求不掛科。這次期末考試,kkksc03需要考4科。因此要開始刷習題集,每科都有乙個習題集,分別有s1,s2,s3,s4道題目,完成每道題目需要一些時間,可能不等 a1.as1,b1.bs2,c1.cs3,d...

揹包型動態規劃 揹包問題1

在n個物品中挑選若干物品裝入揹包,最多能裝多滿?假設揹包的大小為m,每個物品的大小為a i 示例 樣例 1 輸入 3,4,8,5 backpack size 10 輸出 9 樣例 2 輸入 2,3,5,7 backpack size 12 輸出 12 首先要明確一點,在揹包問題中,陣列大小和總稱重有...

揹包型動態規劃 揹包問題3

給定n種物品,每種物品都有無限個.第i個物品的體積為a i 價值為v i 再給定乙個容量為m的揹包.問可以裝入揹包的最大價值是多少?樣例 1 輸入 a 2,3,5,7 v 1,5,2,4 m 10 輸出 15 解釋 裝入三個物品 1 a 1 3,v 1 5 總價值 15.樣例 2 輸入 a 1,2,...