找到可被m整除的k值的最大总和?

时间:2014-04-07 23:58:23

标签: java algorithm

我正在尝试使用算法来找到组合一组数字的不同方法,以便它们可以被5整除。

例如,数组是[9,7,6,8,0,1,4],我试图找到可被5整除的数组中最大的4个数字组合,但我不知道如何找到4的所有组合分别然后将它们相加,然后找出它是否可被5整除,除此之外,总是有一个数字必须包含在由输入决定的4的集合中。

1 个答案:

答案 0 :(得分:0)

以下是我的动态编程方法的 C ++ 实现。 我相信你可以为自己制作一个java版本。

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

const int MAX_NUM = 10000, inf = (1<<30);

bool seen[MAX_NUM][5][5];
int nums[MAX_NUM], dp[MAX_NUM][5][5], N;

int calc(int pos, int taken, int mod)
{
    if(taken == 4)
    {
        if(mod) return -inf;
        return 0;
    }
    if(pos==N) return -inf;

    int &ret = dp[pos][taken][mod];
    bool &isSeen = seen[pos][taken][mod];

    if(isSeen) return ret;
    isSeen = true;
    return ret = max( calc(pos+1, taken+1, (mod+nums[pos])%5 )+nums[pos], calc(pos+1,taken,mod) );
}

int main()
{
    scanf("%d",&N);
    for(int i = 0;i<N;++i) scanf("%d",&nums[i]);

    memset(seen,0,sizeof(seen));
    printf("%d\n",calc(0,0,0));
    return 0;
}

我的解决方案跟踪我正在使用的当前数字(pos),我到目前为止所拍摄的数字(拍摄),所有采取的整数%5(mod)的总和。保持这些信息我试图最大化采用整数的总和,其中mod等于0。

如果没有这样的4个数字,您将得到一个小于零的数字。

相关问题