问题描述:

  n个数组合为某一个特定数的概率。

算法如下:

#include<iostream>
using namespace std;

int zuhe(int n,int m){
int ret=1;
while(m--){
ret*=n;
}
return ret;
}
int fun(int a,int b,int x,int n){
if(x==0&&n==0)
return 1;
if(n==0)
return 0;
int count=0;
int temp=a;
while(temp<=b){
if(x<temp)
break;
count+=fun(a,b,x-temp,n-1);
++temp;
}
return count;
}

int main(){
int n,a,b,x;
cin>>n>>a>>b>>x;
int count=fun(a,b,x,n);
float p=count*1.0/zuhe(b-a+1,n);
printf("%.4f",p);

}

注释:

   1.这里的组合,与数学的组合是有区别的。 需要注意。  这里相当于有放回的抽取

   2.注意审题,之前审题有问题,将n这个条件给审漏了,结果大大的将本问题复杂化了。

我的版本:

  

#include <iostream>
#include <vector>

using namespace std;

int sum=0;

void cal(vector<int> values,int target,int size){
if(!size){
if(!target) sum++;
return;
}
for(int i=0;i<values.size();i++){
if(target-values[i]>=0){
cal(values,target-values[i],size-1);
}
}
}

int main(){
int n,a,b,x;
cin>>n>>a>>b>>x;

vector<int> values;
for(int i=a;i<=b;i++){
values.push_back(i);
}

cal(values,x,n);

int total=1;
for(int i=0;i<n;i++){
total*=(b-a+1);
}
printf("%.4f",(sum*1.00)/total);
}

  AC为100