核工业计算机应用研究所笔试题。
1元,5元,10元的人民币,组合成100元
使用《组合数学》里面的生成函数的方式实现(生成函数很暴力,生成函数的具体内容非常复杂):
假设1*x + 5*y + 10*z == 100
x , y , z 的取值范围为 : x = [0,100] y = [0,20] z = [0,10]
public class CombinationTest
{
public static void main(String[] args)
{
int count = 0;
int time = 0;
for(int x = 0;x <= 100;x++)
{
for(int y = 0;y <= 20;y++)
{
for(int z = 0;z <= 10;z++)
{
if(1*x + 5*y + 10*z == 100)
{
count++;
}
time++;
}
}
}
System.out.println("循环的次数有:" + time + "次");
System.out.println("组合的方式有:" + count + "种");
}
}
使用动态规划更合适!
这样循环次数更少(效率更高!):
public class DynamicPlanningTest
{
static int[] values = {1,5,10};
static int count = 0;
static int time = 0;
public static void main(String[] args)
{
split(100, 0, "");
System.out.println("循环的次数有:" + time + "次");
System.out.println("组合的方式有:" + count + "种");
}
public static void split(int x, int y, String z)
{
if (x < 0)
{
return;
}else
if (x == 0)
{
System.out.println(z);
count++;
return;
}else
for (int i = y; i < values.length; i++)
{
split(x - values[i],i,z + values[i] + "|");
time++;
}
}
}
posted on 2017-04-04 00:04 java-追风筝的人 阅读(409) 评论(0) 编辑 收藏 举报