1 条题解
-
0
这里我们假设N=4 当i=0,执行循环第一句,weights[0]=1 ,那么第一行就是weight[0]=1
当i=1,执行循环第一句,weights[1]=1,那么其实第二行就是第一行拿下来右边加个1
当i=2,执行循环第一句,weights[2]=1,此时即是把第二行拿下来右边再加一个1
接着执行第二个for循环,weights[1]=1+1=2,循环结束,那么第三行就是
当i=3,执行循环第一句,weights[3]=1,此时即是把第三行拿下来右边再加一个1
接着执行第二个for循环,weights[2]=1+2=3,weights[1]=2+1=3,循环结束,那么第四行就是
不难发现其实这个算法只要给定N,它就可以计算出第N行的所有数据 原文链接:https://blog.csdn.net/Slatter/article/details/94743997
#include<iostream> #include<cstring> using namespace std; int N,sum; int weights[10],ans[10],used[11]; int solve(int num,int now) { if(num==N && now==0) return 1; if((num==N && now!=0) || now<0) return 0; for(int i=1;i<=N;i++) { if(used[i]==0) { ans[num]=i; used[i]=1; if(solve(num+1,now-i*weights[num])) return 1; used[i]=0; } } return 0; } int main() { ios::sync_with_stdio(false); cin>>N>>sum; for(int i=0;i<N;i++) //这个循环其实就是算出杨辉三角的最底层数据 { //不了解杨辉三角算法可以自己按照该算法一层层画图 weights[i]=1; //有助于理解,确实就这样看是很难懂的 for(int j=i-1;j>0;j--) //这个算法非常之精妙!!! weights[j] += weights[j-1]; } memset(used,0,sizeof(used)); solve(0,sum); for(int j=0;j<N;j++) { if(j!=N-1) cout<<ans[j]<<" "; else cout<<ans[j]<<endl; } }
- 1
信息
- ID
- 2188
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者