程序的思想是:输入数据是,先使用快排对其从大到小进行排序,然后记录相同数据的个数,比如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. anglehack参赛总结

    自已不足的方面: 自已和伙伴是带着idea去的,但是没有带有很大的热情激励和吸引在场的hacker加入团队,一定要找最优秀的人加入团队,事实上我是有这方面识人认人的能力的,24h,5-6个人的优秀团队 ...

  2. 调用QQ截图

    var SHExecInfo: SHELLEXECUTEINFO; begin //截图前隐藏主程序窗口 Form1.Hide; //等待截图执行完成 SHExecInfo.cbSize := siz ...

  3. 解决cocoapods在64位iOS7系统以下的警告问题

    今天碰到一个非常奇怪的问题.XCODE提示这种警告 Pods was rejected as an implicit dependency for 'libPods.a' because its ar ...

  4. <转载>CSS解决图片过大撑破DIV的方法

    DIV+CSS网页内容中如果插入大于DIV层宽度显示,过大的图片将会撑破网页宽度显示从而网页严重变形,您是否遇到过?这里DIVCSS5给大家介绍几种解决图片撑破撑开网页DIV层方法. 图片撑破宽度解决 ...

  5. DELPHI 通過窗口句柄或窗口标题得到进程句柄

    DELPHI 通過窗口句柄或窗口标题得到进程句柄2009年05月08日 星期五 10:15procedure TForm1.Button1Click(Sender: TObject);varhWind ...

  6. HK共享吧解压密码

    HK共享吧解压密码 编号一:kIioOK9* 编号二:www.mfhk8.com_!h0jn3G+t@ 编号三:www.mfhk8.com_rz~NWjU)cZ 编号四:www.mfhk8.com_$ ...

  7. BestR #31

    hdu 5178 求|a[i] - a[j]| <= k (i < j) <i,j>的对数,一开始认为数据不大就直接ans++了,后来结果出来才知道,啊啊啊,too young ...

  8. struts2由&lt;s:tree&gt;要么dtree小工具 建立树

    一个 .<s:tree>方法: 1.引入新的标签: <%@ taglib prefix="sd" uri="/struts-dojo-tags" ...

  9. Ajax - 登录

    Login.html <head> <title>登录</title> <mce:script src="js/jquery-1.5.2.js&qu ...

  10. Marshal UTF8 Strings in .NET

    原文:Marshal UTF8 Strings in .NET Marshal UTF8 Strings in .NET Wow, what a pain in the butt. .NET stri ...