AcWing 1047. 糖果
阿新 • • 發佈:2022-04-02
題目描述:
由於在維護世界和平的事務中做出巨大貢獻,Dzx被贈予糖果公司2010年5月23日當天無限量糖果免費優惠券。
在這一天,Dzx可以從糖果公司的 N 件產品中任意選擇若干件帶回家享用。
糖果公司的 N 件產品每件都包含數量不同的糖果。
Dzx希望他選擇的產品包含的糖果總數是 K 的整數倍,這樣他才能平均地將糖果分給幫助他維護世界和平的夥伴們。
當然,在滿足這一條件的基礎上,糖果總數越多越好。
Dzx最多能帶走多少糖果呢?
注意:Dzx只能將糖果公司的產品整件帶走。
題目大意:給N件物品,選擇其中某些件,使它們的總和是K的倍數。(選擇模型為揹包問題)
解決方法:DP
集合:所有從前i個物品中選,且總和除以k的餘數是j的所有方案
集合劃分:
#include <cstdio> #include <cstring> using namespace std; const int N = 110; int n, k; int f[N][N]; int max(int x, int y) { return x > y ? x : y; } int main() { scanf("%d%d", &n, &k); memset(f, -0x3f, sizeof f); f[0][0] = 0; for (int i = 1; i <= n; i ++ ) { int w; scanf("%d", &w); for (int j = 0; j < k; j ++ ) f[i][j] = max(f[i - 1][j], f[i - 1][(j + k - w % k) % k] + w); //餘數應為正數 } printf("%d\n", f[n][0]); return 0; }