AcWing 1047. 糖果
原题链接
简单
作者:
锦城虽云乐
,
2024-09-14 17:40:34
,
所有人可见
,
阅读 3
dp数组的选择:首先是选不选某个位置是一种状态,且题目中提醒了有余数一项,所以是一个二维数组,dp[i][j]是进行到第i个糖果余数为j的方法总数,且状态转移方程除了原先的这个位置不选外,如果要选就是a[i]+dp[i-1][j+(k-a[i]%k)%k]
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include<climits>
using namespace std;
const int N = 110, inf = 0x3f3f3f3f;
int n, k;
int a[N];
int f[N][N];
int main()
{
cin >> n >> k;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 0; i < 110; ++i)
for (int j = 0; j < 110; ++j)
f[i][j] = INT_MIN;
f[0][0] = 0;
for (int i = 1; i <= n; i++)
for (int j = 0; j < k; j++)
{
f[i][j] = max(f[i][j], f[i - 1][j]);
f[i][j] = max(f[i][j], f[i - 1][(j + k - a[i] % k) % k] + a[i]);
}
cout << f[n][0] << endl;
return 0;
}