dp问题要考虑不重不漏的问题,有些情况下不重可以不用考虑,但是不漏的情况一定要考虑。
因此解决dp问题的难点和关键所在就是找到dp的状态表示。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=110;
int n,k;
int f[N][N];
int main()
{
memset(f,-0x3f,sizeof(f));//f[0][1],f[0]f[2]等这些是不存在的,所以要将他们初始化为-1,以免影响结果
f[0][0]=0;
scanf("%d%d",&n,&k);
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);//c++有负余数,所以要考虑负余数的存在
}
}
printf("%d\n",f[n][0]);
return 0;
}