f(i,j)=前i个糖果选一些构成j%k的最大值
函数里的j是mod k过的,方程为f(i,j)=max(f(i,j),f(i-1,(j-a[i]%k+k)%k)+a[i]; 边界为d[i][0]=0。
答案即为dp[n][0]。
#include <iostream>
#include <memory.h>
#include <string>
#include <stdio.h>
using namespace std;
int n,k;
int a[105];
int dp[105][105];
int main()
{
cin >> n >> k;
for( int i = 1; i <= n; i++ )
cin >> a[i];
for( int i = 0; i <= n; i++ )
for( int j = 0; j <= k; j++)
{
dp[i][j] = -(1<<30);
if(j==0)
dp[i][j] = 0;
}
for( int i = 1; i <= n; i++ )
{
for( int j = 0;j < k; j++ )
{
dp[i][j] = max(dp[i-1][j], dp[i-1][ (j - a[i]%k + k) % k] + a[i] );
}
}
cout << dp[n][0] << endl;
return 0;
}