倍数问题
#include <vector>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1e3 + 10;
vector<int> a[N];
int f[4][N];
int main()
{
int n, m;
cin >>n >>m;
for(int i = 0 ; i < n ; i ++)
{
int x;
cin >> x;
a[x%m].push_back(x);
}
memset(f,-0x3f,sizeof f);
f[0][0] = 0;
for(int i = 0; i < m; i ++)
{
sort(a[i].begin(), a[i].end());
reverse(a[i].begin(), a[i].end());
for(int j = 0; j < 3 && j < a[i].size(); j ++)
{
int x = a[i][j];
for(int u = 3; u >= 1; u --)
for(int k = 0; k < m; k ++)
{
f[u][k] = max(f[u][k], f[u - 1][((k - a[i][j] % m) + m) % m] + x);
}
}
}
cout << f[3][0] <<endl;
}
问题:
1:为什么要选前3个最大的数,选一个不就好了吗?
答:3个数余数相同的情况下相加也可能是k的倍数,所以可能作为答案。
2.为什么个数从大到小枚举?
答:第u层需要用到第u - 1层的数据,如果从小到大第u - 1层会覆盖掉第u层
未解决 文章被收录于专栏
记录自己还有问题的题目