分析
时间复杂度
状态数量 * 状态转移
$O(n * k)$
c++代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
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];
memset(f, -0x3f, sizeof(f));
f[0][0] = 0;
for (int i = 1; i <= n; i++)
for (int j = 0; j < k; j++)
{
// f[i][j] = max(f[i - 1][j], f[i - 1][(j + k - a[i] % k) % k] + a[i]);
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;
}
参考文献
闫氏Dp分析法😂
AcWing蓝桥杯
为什么j-ai需要模k而不取ai不用模k啊
大哥牛逼!
谢谢hxd
大佬,我可以问一下为什么要将除了f[0][0]之外的所有f[i][j]这个二维数组上的元素为-无穷大吗.
在0件物品里面选,只能有0个糖果,最后糖果数量 % k = 0,第0行除了第0个意外都是非法的。
6 谢谢
那为什么要全部赋值成-0x3f3f3f3f呢?我只赋值f[0]那一行却不行呢
一直没想出来怎么加k 忽然想到是在下憨憨 忘了取余是0😂谢谢大佬