把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);
	}