Java 动态规划,按位异或后所有3个子数组的总和
我最近遇到了一个动态规划问题,我需要解决它,所以我自己无法解决它,所以我开始寻找解决方案。问题是: 你们班有N个学生。每个学生的强度是一个小的非负整数 你是 给定int[]中的这些强度,N个元素的强度。 你将把所有的学生分成三组参加“TrySail”划船比赛。每个学生都必须 只分配给三个团队中的一个。团队不能为空。 奇怪的是,在这场比赛中,一个团队的实力是其成员实力的位异或。 你想最大限度地发挥三个团队的优势。计算并返回可能的最大值 团队实力的总和 约束条件: 1) N将介于3和50之间(含3和50) 2) 强度将包含N个元素 3) 每个强度元素都将介于0和255之间(包括0和255) 我找到了一些解决方案,并针对这一点提出了具体的解决方案。但我仍然不知道这里发生了什么,即使我每行调试它。因此,如果有人知道这个问题,或者理解这个问题,以及他在何处和为什么使用变量sum和按位异或(^)它们,那就非常适合发表一些评论 代码如下:Java 动态规划,按位异或后所有3个子数组的总和,java,c#,dynamic-programming,Java,C#,Dynamic Programming,我最近遇到了一个动态规划问题,我需要解决它,所以我自己无法解决它,所以我开始寻找解决方案。问题是: 你们班有N个学生。每个学生的强度是一个小的非负整数 你是 给定int[]中的这些强度,N个元素的强度。 你将把所有的学生分成三组参加“TrySail”划船比赛。每个学生都必须 只分配给三个团队中的一个。团队不能为空。 奇怪的是,在这场比赛中,一个团队的实力是其成员实力的位异或。 你想最大限度地发挥三个团队的优势。计算并返回可能的最大值 团队实力的总和 约束条件: 1) N将介于3和50之间(含3和
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.