贝西喜欢棋盘游戏和角色扮演类游戏所以她说服Farmer John把她带到玩具店,在那里,她购买了三个不同的骰子,这三个质量均匀的骰子,分别有S1,S2,S3个面。(2 <= S1 <= 20; 2 <= S2 <= 20; 2 <= S3 <= 40). 贝西掷啊掷啊掷啊,想要知道出现几率最大的和是多少。 问题给出三个骰子的面数,让你求出出现几率最大的和是多少。如果有很多种和出现的几率相同,那么就输出小的那一个。
这题按理来说用随机算法也应该能过。
不过我试了却没过。
标准的算法是算出组成每个数的方案数, 然后最大的即为所求
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <vector>
#include <map>
#include <set>
#define MAXN 51111
#define MAXM 555
#define INF 1000000007
using namespace std;
int f[4][86];
int main()
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
for(int i = 1; i <= a; i++) f[1][i] = 1;
for(int i = 1; i <= a + b; i++)
for(int j = 1; j <= b; j++)
if(i > j) f[2][i] += f[1][i - j];
for(int i = 1; i <= a + b + c; i++)
for(int j = 1; j <= c; j++)
if(i > j) f[3][i] += f[2][i - j];
int ans = 0;
for(int i = 1; i <= a + b + c; i++)
if(f[3][ans] < f[3][i])
ans = i;
printf("%d\n", ans);
return 0;
}