ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

杭电oj 1258 Sum It Up

2021-02-04 13:30:20  阅读:174  来源: 互联网

标签:oj nowsum int Sum 不选 杭电 数组 ans sum


dfs
要记录路径最后输出

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int sum,n,ans,x;
/*
sum和n是总和,ans用来记录是否有解,x是一个中间量,临时存数
*/
int a[15],b[15];//数组a存放输入的数据,数组b存放路径
void dfs(int nowsum,int nowk,int bi)//nowsum是当前的和,nowk记录选择的是数组a的第几个数
{								 	//bi记录数组b中的第几个数
    if(nowsum>sum) return ;//当前和超出上限,结束
    if(nowk>n) return ;//当前的数超出数组a的范围,结束
    if(nowsum==sum){//当前和等于sum,输出
        ans++;
        for(int i=0;i<bi;i++){
            if(i) cout<<'+'<<b[i];
            else cout<<b[i];
        }
        cout<<endl;
        return ;
    }
    x=a[nowk];
    b[bi]=x;
    dfs(nowsum+x,nowk+1,bi+1);//选择当前这个数
    while(a[nowk]==a[nowk+1]) nowk++;//去重
    dfs(nowsum,nowk+1,bi);//不选当前这个数
}
int main()
{
    while(cin>>sum>>n){
        if(sum==0&&n==0) return 0;
        for(int i=0;i<n;i++) cin>>a[i];
        ans=0;
        cout<<"Sums of "<<sum<<':'<<endl;
        dfs(0,0,0);
        if(ans==0) cout<<"NONE"<<endl;
    }
    return 0;
}

去重:
因为数组里有多个相同的数,我搜索的策略是选当前这个数或不选当前这个数,如果有三个2,选了第一个,之后两个2都不选 和 第一个、第三个2不选,直选第2个2 结果都是选择了一个2,但这就造成了重复,所以避免重复,在不选这个数的时候,就把后面和这个数相等的数都跳过,这就是中间那句while循环的作用。

标签:oj,nowsum,int,Sum,不选,杭电,数组,ans,sum
来源: https://blog.csdn.net/weixin_45743427/article/details/113639206

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有