程序的思想是:输入数据是,先使用快排对其从大到小进行排序,然后记录相同数据的个数,比如4 3 3 2 2 1 1,最后的数据变成4 3 2 1 ,并且同时数据的个数f[]变成1 2 2 2

然后就是遍历,相同的数据如果不能得到最后的结果,下一次就不会遍历。

//剪枝有这几个

首先:从大到小排序,剪枝1

再者:如果当前的sum比要遍历的数据小,则跳过这个数据

利用一个vector来记录结果

#include <iostream>
//#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
/*0MS 344K*/
//function
int cmp(const void *a,const void *b);
void dfs(int index,int sum); //var
int a[13]; //输入数据
int b[13]; //记录从大到小的数据,相同数据个数记录在f[]中
int l; //b[]数据的长度
int f[13]; //记录当前数据b[]的个数
vector<int> c; //结果
bool flag;
//fstream fin;
int main()
{
//fin.open("1258.txt",ios::in);
int t,n;
while(cin>>t>>n&&n!=0)
{
flag=false;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
memset(f,0,sizeof(f));
qsort(a,n,sizeof(a[0]),cmp);
//把相同的数据合并在一起
int cur=a[0]; //当前数据是多少
int j=0;
b[j]=cur;
for(int i=0;i<n;i++)
{
if(a[i]==cur)
f[j]++;
else
{
cur=a[i];
b[++j]=cur;
i--;
}
}
l=++j; cout<<"Sums of "<<t<<":"<<endl;
dfs(0,t);
if(!flag)
cout<<"NONE"<<endl;
}
system("pause");
return 0;
} void dfs(int index,int sum)
{
if(sum==0)
{
flag=true;
int length=c.size();
for(int i=0;i<length-1;i++)
cout<<c[i]<<"+";
cout<<c[length-1]<<endl;
}
else
{
for(int i=index;i<l;i++)
{
if(b[i]>sum) continue;//剪枝
else
{
c.push_back(b[i]);
f[i]--;
if(f[i]==0)
dfs(i+1,sum-b[i]);
else if(f[i]>0)
dfs(i,sum-b[i]);
f[i]++;
c.pop_back();
}
}
}
} int cmp(const void *a,const void *b)
{
return ((*(int *)b)-(*(int *)a));
}

hdoj 1258 SUM IT UP的更多相关文章

  1. hdoj - 1258 Sum It Up && hdoj - 1016 Prime Ring Problem (简单dfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=1258 关键点就是一次递归里面一样的数字只能选一次. #include <cstdio> #inclu ...

  2. HDOJ(HDU).1258 Sum It Up (DFS)

    HDOJ(HDU).1258 Sum It Up (DFS) [从零开始DFS(6)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双 ...

  3. HDU 1258 Sum It Up(dfs 巧妙去重)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1258 Sum It Up Time Limit: 2000/1000 MS (Java/Others) ...

  4. hdu 1258 Sum It Up (dfs+路径记录)

    pid=1258">Sum It Up Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  5. 【HDOJ】1258 Sum It Up

    典型的深搜,剪枝的时候需要跳过曾经搜索过的相同的数目,既满足nums[i]=nums[i-1]&&visit[i-1]==0,visit[i-1]==0可以说明该点已经测试过. #in ...

  6. hdu 1258 Sum It Up(dfs+去重)

    题目大意: 给你一个总和(total)和一列(list)整数,共n个整数,要求用这些整数相加,使相加的结果等于total,找出所有不相同的拼凑方法. 例如,total = 4,n = 6,list = ...

  7. HDU 1258 Sum It Up

    Sum It Up Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total S ...

  8. (step4.3.4)hdu 1258(Sum It Up——DFS)

    题目大意:输入t,n,接下来有n个数组成的一个序列.输出总和为t的子序列 解题思路:DFS 代码如下(有详细的注释): #include <iostream> #include <a ...

  9. HDOJ(1001) Sum Problem

    这一套题做错了几次,按理说直接用等差数列求和公式就行了,主要是要考虑一些运算符的结核性问题: 四则运算符(+.-.*./)和求余运算符(%)结合性都是从左到右. 于是,我自己写了一个版本,主要是考虑( ...

随机推荐

  1. WCF技术剖析之十六:数据契约的等效性和版本控制

    原文:WCF技术剖析之十六:数据契约的等效性和版本控制 数据契约是对用于交换的数据结构的描述,是数据序列化和反序列化的依据.在一个WCF应用中,客户端和服务端必须通过等效的数据契约方能进行有效的数据交 ...

  2. maven项目部署到Repository(Nexus)

    目录[-] (一)下载并安装Nexus (二)配置Nexus Repository 说明: (三)在项目中配置Nexus Repository的信息 (四)发布到Nexus Repository 本文 ...

  3. ajax动态加载的图标

    http://www.ajaxload.info/ 这个网站可以动态生成ajax加载样式的小图片,git格式,挺不错推荐给大家

  4. 12.5.3 UNIVERSAL:最终的祖先类:

    <pre name="code" class="html">12.5.3 UNIVERSAL:最终的祖先类: 你可以把 UNIVERSAL 看作最终 ...

  5. CSDN-Code平台使用过程中的5点经验教训

    昨天又创建了一个项目,fucms,可是本地一直没有权限提交,搞了非常久,试了几十次,都不行,我是非常的灰心和郁闷.  刚刚,和CSDN-Code的官方客服咨询了非常久非常久,最终摸索出来了一些心得体会 ...

  6. 【linux】linux根文件系统制作

    欢迎转载,转载时请保留作者信息,谢谢. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http:// ...

  7. perl 继承小例子

    <pre name="code" class="html"><pre name="code" class="ht ...

  8. 基于visual Studio2013解决C语言竞赛题之1061最大值和次最大值

       题目 解决代码及点评 /* 功能: 编写子函数, 求一维整型数组M[10]的最大值及次最大值(次最大值可能不存在). 主函数中输入10个整数, 然后调用上述子函数, 若次最大值存在, ...

  9. 一些实用的mysql语句(不断积累更新)

    1.数据表里仅仅有生日字段,想计算出其年龄的mysql语句: SELECT *,DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW( ))-TO_DAYS(生日字段)),'%Y')+0 ...

  10. 【图论】2-sat总结

    2-sat总结 2-sat问题,一般表现的形式为.每一个点有两种方式a,b,要么选a,要么选b.而且点点之间有一些约束关系.比如:u和v至少一个选a.那么这就是一个表达式.把a当成真,b当成假,那就是 ...