递归两条线

201301 JAVA题目0-1级

http://www.nowcoder.com/questionTerminal/9af744a3517440508dbeb297020aca86

这道题和以前做过的求和是一个思路,凑数(求和)题目如下:

链接:https://blog.nowcoder.net/n/a6b71a5651874650a65945e9bae8e5bf
这个题是一维的,直接把一段数字进行遍历,然后把能构成的都输出出来就行。
在遍历解空间过程中,适当剪枝可以增大程序的时间效率。

#include<iostream>
#include<vector>
using namespace std;
int n,m;
vector<int> vec;
void dfs(int i,int sum){
    if(sum==m){//凑够数了,进行输出
        for(int j=0;j<vec.size();j++){
            if(j==vec.size()-1){
                cout<<vec[j]<<endl;
            }else{
                cout<<vec[j]<<" ";
            }
        }
    }else{//没凑过数,继续进行遍历
        for(int j=i;j<=n&&sum<m&&j<=m;j++){//sum<m&&j<=m对树进行剪枝
            vec.push_back(j);
            dfs(j+1,sum+j);
            vec.pop_back();//凑够了就弹出,没凑够说明加上这个数不可能凑够,所以也弹出
        }
    }
}
int main(){
    while(cin>>n>>m){
        dfs(1,0);
    }
    return 0;
}

而这道题,更像是二维的一个递归,因为有两条线要走,要分别同时凑够两条线,
可以这么想,把5的倍数加起来存到sum5,把3的倍数加起来存到sum3,剩下的数存到vector数组里。
然后取sum5-sum3的绝对值,这样只需看数组里的数能否凑出两部分,使其差值是abs(sum5-sum3)。
如果可以构成,就说明可以。
但是重点是怎么用递归表示两条线呢?

我们可以这样想,先把所有的数都加起来,然后再依次减去所有的数,
可以看代码进行分析:

#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
vector<int> elsevec;
int n,m,sum3,sum5,dis0; 
bool f(int i,int dis){
    if(i==elsevec.size()){
        return abs(dis)==dis0;
    }return (f(i+1,dis+elsevec[i])||f(i+1,dis-elsevec[i])); //**重点**
}
int main(){
    while(cin>>n){
        sum3=sum5=0;
        elsevec.clear();
        int t=n;
        while(t--){
            cin>>m;
            if(m%5==0){
                sum5+=m;    
            }else if(m%3==0){
                sum3+=m;
            }else{
                elsevec.push_back(m);
            }
        }dis0=abs(sum5-sum3);    
        if(f(0,0)){
            cout<<"true"<<endl;
        }else cout<<"false"<<endl;
    }
    return 0;
} 

代码的重点在于我标记的那个递推式:
我们可以画出解空间:

1 5 -5 1为例
图片说明

全部评论
妙就妙在这句:return (f(i+1,dis+elsevec[i])||f(i+1,dis-elsevec[i]));妙妙妙喵喵
1 回复 分享
发布于 2021-03-16 18:07
凡是划重点的就一定是我看不懂的 opz
点赞 回复 分享
发布于 2021-11-03 21:56
完了,看答案都看得一脸懵逼,我是不是这辈子不适合干编程了
点赞 回复 分享
发布于 2021-09-13 17:30
厉害
点赞 回复 分享
发布于 2021-08-12 17:01
为什么还要或一个减最后一个值
点赞 回复 分享
发布于 2021-03-21 11:51
太牛了!!!多谢讲解!
点赞 回复 分享
发布于 2020-07-10 15:19

相关推荐

Twilight_mu:经典我朋友XXXX起手,这是那种经典的不知道目前行情搁那儿胡编乱造瞎指导的中年人,不用理这种**
点赞 评论 收藏
分享
评论
24
6
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务