3,881
社区成员
发帖
与我相关
我的任务
分享
#include <cassert>
#include <cmath>
#include <map>
#include <iostream>
#include <vector>
struct problem_t
{
double operator () (size_t const i, int const n) const
{
return f(i,n);
}
double f (size_t const i, int const n) const
{
assert(i < N);
if (n < 0) { return 1; }
if (n > int(K*(N-i))) { return 0; }
if (i+1 == N) // single integr probability.
{
return (K-n)/(K+1.);
}
else
{
double p = 0;
for (size_t k = 0; k <= K; ++k)
{
p += pf(i+1,n-k);
}
return p/(K+1.);
}
}
double pf (size_t const i, int const n) const
{
static std::vector<std::map<int,double>> probabilities(N);
auto& probs = probabilities[i];
auto it = probs.find(n);
if (probs.end() == it)
{
auto const ans = probs.insert({n,f(i,n)}); assert(ans.second);
it = ans.first;
}
assert(it->second >= 0);
return it->second;
}
size_t const N; // # of elements in sequence.
size_t const K; // upper limit, element value in [0,K].
};
int main ()
{
size_t const n_elements = 50;
size_t const upper_limit = 100;
size_t const starting_index = 0;
size_t const target_threshold = 3000;
std::cout << problem_t{n_elements,upper_limit}(starting_index,target_threshold) << std::endl;
}
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int d[6];
int i,n,a,b,t;
int c,j;
void main() {
srand(time(NULL));
printf("shuffle 0..n-1 demo\n");
for (n=1;n<=5;n++) {/* 测试1~5个元素 */
printf("_____n=%d_____\n",n);
j=1;
for (c=1;c<=n;c++) j=j*c;/* j为n! */
j*=n*2;
for (c=1;c<=j;c++) {/* 测试n*2*n!次 */
for (i=0;i<n;i++) d[i]=i;/* 填写0~n-1 */
for (i=n;i>0;i--) {/* 打乱0~n-1 */
a=i-1;b=rand()%i;
if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
}
printf("%04d:",c);
for (i=0;i<n;i++) printf("%d",d[i]);
printf("\n");
}
}
printf("shuffle 1..n demo\n");
for (n=1;n<=5;n++) {/* 测试1~5个元素 */
printf("_____n=%d_____\n",n);
j=1;
for (c=1;c<=n;c++) j=j*c;/* j为n! */
j*=n*2;
for (c=1;c<=j;c++) {/* 测试n*2*n!次 */
for (i=1;i<=n;i++) d[i]=i;/* 填写1~n */
for (i=n;i>1;i--) {/* 打乱1~n */
a=i;b=rand()%i+1;
if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
}
printf("%04d:",c);
for (i=1;i<=n;i++) printf("%d",d[i]);
printf("\n");
}
}
}