题目

由于在维护世界和平的事务中做出巨大贡献,Dzx被赠予糖果公司2010年5月23日当天无限量糖果免费优惠券。

在这一天,Dzx可以从糖果公司的 N 件产品中任意选择若干件带回家享用。

糖果公司的 N 件产品每件都包含数量不同的糖果。

Dzx希望他选择的产品包含的糖果总数是 K 的整数倍,这样他才能平均地将糖果分给帮助他维护世界和平的伙伴们。

当然,在满足这一条件的基础上,糖果总数越多越好。

Dzx最多能带走多少糖果呢?

注意:Dzx只能将糖果公司的产品整件带走。
image-1670597193389

题解

f[i][j]表示选第i个物品时,模k的余数为j的最大值。
由于负数取模仍然为负数,所以需要变成正数:(j+k-w%k)%k

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=110;
int f[N][N];
int n,k;

int main(){
    cin>>n>>k;
    memset(f,-0x3f,sizeof f);
    f[0][0]=0;
    for(int i=1;i<=n;i++){
        int w;
        cin>>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);
        }
    }
    cout<<f[n][0];

    return 0;
}
```