我正在尝试使用算法来找到组合一组数字的不同方法,以便它们可以被5整除。
例如,数组是[9,7,6,8,0,1,4]
,我试图找到可被5整除的数组中最大的4个数字组合,但我不知道如何找到4的所有组合分别然后将它们相加,然后找出它是否可被5整除,除此之外,总是有一个数字必须包含在由输入决定的4的集合中。
答案 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个数字,您将得到一个小于零的数字。