Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 动态规划,按位异或后所有3个子数组的总和_Java_C#_Dynamic Programming - Fatal编程技术网

Java 动态规划,按位异或后所有3个子数组的总和

Java 动态规划,按位异或后所有3个子数组的总和,java,c#,dynamic-programming,Java,C#,Dynamic Programming,我最近遇到了一个动态规划问题,我需要解决它,所以我自己无法解决它,所以我开始寻找解决方案。问题是: 你们班有N个学生。每个学生的强度是一个小的非负整数 你是 给定int[]中的这些强度,N个元素的强度。 你将把所有的学生分成三组参加“TrySail”划船比赛。每个学生都必须 只分配给三个团队中的一个。团队不能为空。 奇怪的是,在这场比赛中,一个团队的实力是其成员实力的位异或。 你想最大限度地发挥三个团队的优势。计算并返回可能的最大值 团队实力的总和 约束条件: 1) N将介于3和50之间(含3和

我最近遇到了一个动态规划问题,我需要解决它,所以我自己无法解决它,所以我开始寻找解决方案。问题是:

你们班有N个学生。每个学生的强度是一个小的非负整数

你是 给定int[]中的这些强度,N个元素的强度。 你将把所有的学生分成三组参加“TrySail”划船比赛。每个学生都必须 只分配给三个团队中的一个。团队不能为空。 奇怪的是,在这场比赛中,一个团队的实力是其成员实力的位异或。 你想最大限度地发挥三个团队的优势。计算并返回可能的最大值 团队实力的总和

约束条件:

1) N将介于3和50之间(含3和50)

2) 强度将包含N个元素

3) 每个强度元素都将介于0和255之间(包括0和255)

我找到了一些解决方案,并针对这一点提出了具体的解决方案。但我仍然不知道这里发生了什么,即使我每行调试它。因此,如果有人知道这个问题,或者理解这个问题,以及他在何处和为什么使用变量sum和按位异或(^)它们,那就非常适合发表一些评论

代码如下:

public class TrySail
{
    public int get(int[] strength)
    {
        var dp = new bool[256, 256];
        dp[0, 0] = true;
        var sum = 0;
        foreach (var x in strength)
        {
            var next = new bool[256, 256];
            for (int i = 0; i < 256; i++)
                for (int j = 0; j < 256; j++)
                {
                    if (!dp[i, j]) continue;
                    var rem = sum ^ i ^ j;
                    next[i ^ x, j] |= dp[i, j];
                    next[i, j ^ x] |= dp[i, j];
                    next[i, j] |= dp[i, j];
                }
            dp = next;
            sum ^= x;
        }
        var max = 0;
        for (int i = 0; i < 256; i++)
            for (int j = 0; j < 256; j++)
            {
                if (!dp[i, j]) continue;
                var rem = sum ^ i ^ j;
                max = Math.Max(max, i + j + rem);
            }
        return max;
    }

}

代码是用C#

写的,我非常不相信有人会在这里给你做作业。。你有什么具体的问题吗?我只是一些评论,为什么他用那个总和,到底是为了什么,这只是为了分析和评论,或者也许可以用不同的算法来解决这个问题
{7,3,5,2}

Returns: 17

There are 6 ways to make 3 teams:

· {0},{1},{2,3}: sum of strengths is 7+3+(5 xor 2) = 17

· {0},{2},{1,3}: sum of strengths is 7+5+(3 xor 2) = 13

· {0},{3},{1,2}: sum of strengths is 7+2+(3 xor 5) = 15

· {1},{2},{0,3}: sum of strengths is 3+5+(7 xor 2) = 13

· {1},{3},{0,2}: sum of strengths is 3+2+(7 xor 5) = 7

· {2},{3},{0,1}: sum of strengths is 5+2+(7 xor 3) = 11

Therefore, the answer is 17.