• 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;
    }
    

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

  • 相关阅读:
    线程、协程、Goroutine的区别和联系
    Docker是如何实现跨平台的等问题
    Docker容器与虚拟机有什么区别?
    带www和不带www的域名有什么区别
    netty 入门前阅读
    netty 入门示例
    thingsboard 入门教程
    RSAUtil 工具类
    java zip 打包
    redis 详细讲解
  • 原文地址:https://www.cnblogs.com/lichangjian/p/12907136.html
Copyright © 2020-2023  润新知