把N个骰子扔在地下,所有骰子朝下一面的和为s,输入n,打印出s所有可能的值出现的概率
把N个骰子扔在地上,所有骰子朝上一面的和为s,输入n,打印出s所有可能的值出现的概率
思路:这是一道动态规划的题目,而动态规划最难的就是要找出最优子结构,并采取一种称为备忘录的方法避免重复计算。
F(k,n)表示k个骰子点数和为n的种数,k表示骰子个数,n表示k个骰子的点数和
F(k,n)=F(k-1,n-6)+F(k-1,n-5)+...+F(k-1,n-1)
当k=1时
F(1,1)=F(1,2)....F(1,6)=1
参考代码如下
public void printSumProbality(int number)
{
int[]psum=new int[6*number+1];
double total=Math.pow(6, number);
int size=6*number;
int i,j,k;
for(i=1;i<=6;i++)
psum[i]=1;
for(i=2;i<=number;i++)
{
for(j=i*6;j>=i;j--)
{
for(k=1;k<=6 && j>k;k++)
{
psum[j]+=psum[j-k];
}
}
for(j=i-1;j>=0;j--)
{
psum[j]=0;
}
}
for(i=0;i<=size;i++)
{
System.out.println("sum="+i+"p="+(psum[i]/total));
}
}
public static void main(String[] args)
{
FindProbability find=new FindProbability();
find.printSumProbality(4);
}