有些数据量不大的题目可以通过暴力搜索来实现,有固定的做题套路,下面写两道简单的题来总结一下:
/**
* 有一群海盗(不多于20人),在船上比拼酒量。
* 过程如下:打开一瓶酒,所有在场的人平分喝下,
* 有几个人倒下了。再打开一瓶酒平分,又有倒下的,
* 再次重复...... 直到开了第4瓶酒,坐着的已经所剩无几,
* 海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。
* 等船长醒来,发现海盗船搁浅了。他在航海日志中写到:
* “......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......”
* 请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。
* 如果有多个可能的答案,请列出所有答案,每个答案占一行。
* 格式是:人数,人数,... 例如,有一种可能是:20,5,4,2,0
* @author Felicitia
*
*/
public class Pirate {
static int leftNum[];
static int maxDeep;
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
maxDeep = 4;
leftNum = new int[maxDeep];
for(int i=1; i<=20; i++)
{
leftNum[0] = i;
search(leftNum, 1);
}
}
public static void search(int[] leftNum, int deep)
{
if(deep == maxDeep)
{
double result = 0;
for(int i=0; i<maxDeep; i++)
{
result += 1.0/leftNum[i];
}
if(Math.abs(result-1) < 0.0001)
{
for(int i=0; i<maxDeep; i++)
{
System.out.print(leftNum[i]+",");
}
System.out.println("0");
}
}
else
{
for(int i=1; i<leftNum[deep-1]; i++)
{
leftNum[deep] = i;
search(leftNum, deep+1);
}
}
}
}
/**
* 某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:
* 每位选手需要回答10个问题(其编号为1到10),越后面越有难度。
* 答对的,当前分数翻倍;答错了则扣掉与题号相同的分数
* (选手必须回答问题,不回答按错误处理)。 每位选手都有一个
* 起步的分数为10分。 某获胜选手最终得分刚好是100分,如果不让
* 你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答
* 错了吗? 如果把答对的记为1,答错的记为0,则10个题目的回答情
* 况可以用仅含有1和0的串来表示。例如:0010110011 就是可能的情况。
* 你的任务是算出所有可能情况。每个答案占一行
* @author Felicitia
*
*/
public class Score {
public static void main(String argv[])
{
int maxDeep = 10;
int[] array = new int[maxDeep];
for(int i=0; i<2; i++)
{
array[0] = i;
search(maxDeep, 1, array);
}
}
private static void search(int maxDeep, int deep, int[] array)
{
if(maxDeep == deep)
{
int score = 10;
for(int i=0; i< maxDeep; i++)
{
if(array[i]==1)
{
score *= 2;
}
else
{
score -= (i+1);
}
}
if(score == 100)
{
for(int i=0; i<maxDeep; i++)
System.out.print(array[i]);
System.out.println();
}
}
else
{
for(int i=0; i<2; i++)
{
array[deep] = i;
search(maxDeep, deep+1, array);
}
}
}
}