T3 难题 题解

小王在考试中遇到一道难题:方程 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;
}

嗯,妙啊,妙啊,深搜真好,我只能说这个题不变态了啊,写的像个数论,却没有卡搜索的数据(可能他就是个搜索)。

上一篇:[linux tips] puppet client ssl 证书过期


下一篇:java-如何以编程方式知道应用程序是否已使用调试或导出证书签名?