倍数问题

#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层

未解决 文章被收录于专栏

记录自己还有问题的题目

全部评论

相关推荐

点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务