题目
由于在维护世界和平的事务中做出巨大贡献,Dzx被赠予糖果公司2010年5月23日当天无限量糖果免费优惠券。
在这一天,Dzx可以从糖果公司的 N 件产品中任意选择若干件带回家享用。
糖果公司的 N 件产品每件都包含数量不同的糖果。
Dzx希望他选择的产品包含的糖果总数是 K 的整数倍,这样他才能平均地将糖果分给帮助他维护世界和平的伙伴们。
当然,在满足这一条件的基础上,糖果总数越多越好。
Dzx最多能带走多少糖果呢?
注意:Dzx只能将糖果公司的产品整件带走。
题解
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;
}
```