第一种解法:
递归:
int n=7; void sump(int cur,int val,int tsum,vector<int>& vec){ if(cur==1){ vec[val+tsum-n]++;//第一个骰子加上剩下的筛子的取值和就是该位置上的和了。 }else{ for(int i=1;i<=6;++i){ int sum=val+tsum; sump(cur-1,i,sum,vec); } } } int main(){ vector<int> ivec(n*6-n+1); for(int i=1;i<=6;++i){//这里相当于第一个骰子的取值。 sump(n,i,0,ivec); } for(int i=0;i<ivec.size();++i){ cout<<ivec[i]<<" "; } cout<<endl; return 0; }
第二种办法,用循环数组:
void sump2(){ vector< vector<int> > vec(2,vector<int>(n*6+1,0)); int flag=0; for(int i=1;i<=6;++i) vec[flag][i]=1; for(int k=2;k<=n;++k){ for(int i=0;i<=6*n;++i) vec[1-flag][i]=0; for(int i=k;i<=k*6;++i){ for(int j=1;j<=i&&j<=6;++j){ vec[1-flag][i]+=vec[flag][i-j]; } } flag=1-flag; } for(int i=n;i<=6*n;++i){ cout<<vec[flag][i]<<" "; } cout<<endl; }