题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输出n,打印出s的所有可能的值出现的概率。
动态规划思想:
f(n,s)=f(n-1,s-1)+f(n-1,s-2)+f(n-1,s-3)+f(n-1,s-4)+f(n-1,s-5)+f(n-1,s-6) ,0< n<=6n
f(n,s)=0, s< n or s>6n or n=1
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int getNSumCount(int n, int sum) {
if (n<1 || sum<n || sum>6 * n) {
return 0;
}
if (n == 1) {
return 1;
}
int resCount = 0;
resCount = getNSumCount(n - 1, sum - 1) + getNSumCount(n - 1, sum - 2) +
getNSumCount(n - 1, sum - 3) + getNSumCount(n - 1, sum - 4) +
getNSumCount(n - 1, sum - 5) + getNSumCount(n - 1, sum - 6);
return resCount;
}
int main() {
int n = 0;
while (true) {
cout << "input dice num:";
cin >> n;
for (int i = n; i <= 6 * n; ++i)
cout << "f(" << n << "," << i << ")=" << getNSumCount(n, i) << endl;
int total = pow((float)6, n);
for (int i = n; i <= 6 * n; ++i) {
float ratio = (float)getNSumCount(n, i) / total;
cout << i << " " << ratio << endl;
}
}
}