The number of distinct die rolls is S1*S2*S3 <= 20*20*40 = 16000, so we can afford to simply loop over them all, maintaining a count of how often each sum occurs. From this we can determine the most common sum.
#include <assert.h> #include <stdio.h> const int MAXS1 = 20 + 5; const int MAXS2 = 20 + 5; const int MAXS3 = 40 + 5; int count[MAXS1 + MAXS2 + MAXS3 + 1]; int main() { FILE * fin = fopen("bones.in", "r"); FILE * fout = fopen("bones.out", "w"); assert(fin != NULL); assert(fout != NULL); int s1,s2,s3; fscanf(fin, "%d %d %d", &s1, &s2, &s3); /* count possible rolls */ for (int i=1;i<=s1;i++) for (int j=1;j<=s2;j++) for (int k=1;k<=s3;k++) count[i+j+k]++; /* find the best */ int best = 0; for (int i=3;i<=s1+s2+s3;i++) if (count[i] > count[best]) best = i; fprintf(fout, "%d\n", best); return 0; }