■题目描述
有一个数字游戏叫做2048,此游戏的规则为,两个相同的数字能进行相加。例如:两个2可以相加,则相加后4的个数加一,2的个数会减二。
现在有一串数字,为目前已知的数字的数量。问至少还需要几次相加,才能获得2048 (题目保证能够相加得到2048)。
输入描述:
第一行为样例数T,代表后面会跟随工组测试数据。
每组测试数据输入10个数,分别代表
2,4,8,16,32,64,128,256,512,1024的个数。
每种数字的个数不超过1024。
输出描述:
对于每组数据, 输出一个数, 表示需要得到2048最少需要相加的次数。
输入
2
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 2
输出
10
1
package javatests.demo;
import java.util.Scanner;
public class JavaTest {
public static void main(String[] args) {
int []nums={10,10,10,1,1,1,1,1,1,10};
int ans=getRes(nums,9,0);
//思路:递归求解,每次递归更新当前数组状态;并记录相加次数;得到2048的相加次数等于得到两个1024所需要的相加的次数+1;问题转化为子问题如何求解相加等于两个1024的次数,
System.out.println(ans);
}
/*static int getRes(int[]numss,int cur,int result){
if(cur<0)return result;
while(numss[cur]<2){
result=getRes(numss,cur-1,result);
numss[cur]+=1;
}
numss[cur]-=2;
return ++result;
}*/
static int getRes(int[]numss,int cur,int result){
if(cur<0)return result;
if(numss[cur]>=2){
numss[cur]-=2;
++result;
}else{
while(numss[cur]<2){
result=getRes(numss,cur-1,result);
numss[cur]+=1;
}
numss[cur]-=2;
++result;
}
return result;
}
}