小王在考试中遇到一道难题:方程 a1+a2+„„+an=m 的非负整数解有几个,请你帮他算 一下(这也可以算作他作弊吧)。 输入格式 一行,两个以空格隔开的数 n,m,表示方程 a1+a2+„„+an=m
这个题我诚实的说,我不会……
数据范围再大点我就不会了。
这个题看起来是数论,写起来也是数论,哪哪都像数论。
But!
对于50%的数据,0<=n,m<=10,结果<200 对于100%的数据,0<=n,m<32767, 结果<32767
我们注意一下第二句,结果小于32767,这是个什么概念,意思是说(我简单描述),n再大于等于8的情况下,m最大是1。
n>=8啊,这玩意用的着数论?是你数论太香了,还是我打不动深搜了?有简单的深搜干嘛不打(个人觉得深搜好写一点)。
直接一波纯洁深搜(没找到可以优化的点):
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; long long n,m,cs; void dfs(long long wz,long long shu) { if(wz==n)//搜了n个数 { if(shu==m)//正好所有数相加等于m { cs++;//有了一个新的方法 return; } return; } for(int i=0;i<=m-shu;i++)//一个小优化 { dfs(wz+1,shu+i);//下一层循环 } return; } int main() { freopen("problem.in","r",stdin); freopen("problem.out","w",stdout);//要写freopen,重要的事情写3遍。 scanf("%lld%lld",&n,&m); dfs(0,0);//搜索开始 printf("%lld",cs); return 0; }
嗯,妙啊,妙啊,深搜真好,我只能说这个题不变态了啊,写的像个数论,却没有卡搜索的数据(可能他就是个搜索)。