第一种解法:
递归:
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;
}