题目:
篮球(5V5)比赛中,每个球员拥有一个战斗力,每个队伍的所有球员战斗力之和为该队伍的总体战斗力。现有10个球员准备分为两队进行训练赛,教练希望2个队伍的战斗力差值能够尽可能的小,以达到最佳训练效果。给出10个球员的战斗力,如果你是教练,你该如何分队,才能达到最佳训练效果?请输出该分队方案下的最小战斗力差值。
输入描述:
10个篮球队员的战斗力(整数,范围[1,10000]),战斗力之间用空格分隔,如:10 9 8 7 6 5 4 3 2 1
不需要考虑异常输入的场景。
输出描述:
最小的战斗力差值,如:1
示例1
输入
10 9 8 7 6 5 4 3 2 1
输出
1
说明
1 2 5 9 10分为一队,3 4 6 7 8分为一队,两队战斗力之差最小,输出差值1。备注:球员分队方案不唯一,但最小战斗力差值固定是1
使用动态规划解题,代码如下
public static int[][] dps(int[] w, int[] v, int capacity)
{
//int[][] dp = new int[w.length][capacity];
int[][] maxdp = new int[w.length][];
//dp[w.length][capacity]= {{ 0 }};
for(int i=1;i<=w.length; i++)
{
//****这里容量的变化是前一个物品的体积,不是简单的+1
for(int j=0; j<=capacity; j=j++)
{
maxdp[0][capacity-1] = 0; //动态的第二维, 早初始化边界条件
maxdp[w.length-1][0] = 0;
maxdp[1][1] = v[1]; //先把第一个物品装入背包,之后的物品在这个基础上
if(j<w[i])
{
maxdp[i][j]= maxdp[i-1][j];
}
else {
maxdp[i][j]=Math.max(maxdp[i-1][j], maxdp[i-1][j-w[i]]+v[i]);
System.out.println(maxdp[i][j]);
}
System.out.println(maxdp[i][j]);
}
}
return maxdp;
}
运行时, maxdp[i][j]=Math.max(maxdp[i-1][j], maxdp[i-1][j-w[i]]+v[i]);
报ArrayIndexOfBoundsException
请懂的童鞋指导指导。谢谢~~