hdoj 1258 SUM IT UP
程序的思想是:输入数据是,先使用快排对其从大到小进行排序,然后记录相同数据的个数,比如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的更多相关文章
- hdoj - 1258 Sum It Up && hdoj - 1016 Prime Ring Problem (简单dfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1258 关键点就是一次递归里面一样的数字只能选一次. #include <cstdio> #inclu ...
- HDOJ(HDU).1258 Sum It Up (DFS)
HDOJ(HDU).1258 Sum It Up (DFS) [从零开始DFS(6)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双 ...
- 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) ...
- hdu 1258 Sum It Up (dfs+路径记录)
pid=1258">Sum It Up Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- 【HDOJ】1258 Sum It Up
典型的深搜,剪枝的时候需要跳过曾经搜索过的相同的数目,既满足nums[i]=nums[i-1]&&visit[i-1]==0,visit[i-1]==0可以说明该点已经测试过. #in ...
- hdu 1258 Sum It Up(dfs+去重)
题目大意: 给你一个总和(total)和一列(list)整数,共n个整数,要求用这些整数相加,使相加的结果等于total,找出所有不相同的拼凑方法. 例如,total = 4,n = 6,list = ...
- HDU 1258 Sum It Up
Sum It Up Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- (step4.3.4)hdu 1258(Sum It Up——DFS)
题目大意:输入t,n,接下来有n个数组成的一个序列.输出总和为t的子序列 解题思路:DFS 代码如下(有详细的注释): #include <iostream> #include <a ...
- HDOJ(1001) Sum Problem
这一套题做错了几次,按理说直接用等差数列求和公式就行了,主要是要考虑一些运算符的结核性问题: 四则运算符(+.-.*./)和求余运算符(%)结合性都是从左到右. 于是,我自己写了一个版本,主要是考虑( ...
随机推荐
- UVA 10317 - Equating Equations (背包)
Problem F Equating Equations Input: standard input Output: standard output Time Limit: 6 seconds Mem ...
- 手把手教你安装QT集成开发环境(操作系统为ubuntu10.04)
在安装QT集成开发工具包之前需要先安装build-essential和libncurses5-dev这两个开发工具和库,libncurses5-dev库是一个在Linux/Unix下广泛应用的图形函数 ...
- boost uuid 学习笔记
#include <vector>#include <iostream>#include <boost/uuid/uuid.hpp>#include <boo ...
- [置顶] 浅谈Android的资源编译过程
Android APK 一.APK的结构以及生成 APK是Android Package的缩写,即Android application package文件或Android安装包.每个要安装到Andr ...
- 恢复PasswordChar 默认值、取消密码框设置
//三种都是清空 this.textBox1.PasswordChar = new char(); this.textBox1.PasswordChar = '\0'; this.textBox1.P ...
- EasyUI - Tree 树组件
效果: 数据库设计: 使用的数据: 其中的字段,是跟据要生成的树节点的属性定义的. text:代表要显示的字段名称. state:是否是目录节点. iconCls:节点的图标是什么. url:跳转的链 ...
- Qt之多线程
源地址:http://blog.csdn.net/liuhongwei123888/article/details/6072320 Qt 是一种基于 C++ 的跨平台 GUI 系统,能够提供给用户构造 ...
- 基于visual Studio2013解决面试题之0603调整数组
题目
- dos批量替换当前目录后缀名
有时候有些后缀名不满足条件,就需要进行批量的替换,如果人为的去替换,那么如果量少的话还好说,量多的话一个个去替换就太傻了,今天从网络上面查找了一些批量替换的dos命令,用起来还挺好用的,就直接把代码贴 ...
- JSP自定义标签——简单标签(1)
前面一篇博客介绍了自定义标签的传统标签使用方式,但是我们会发现,使用传统标签非常的麻烦,而且接口还多,现在传统标签基本都没用了,除了一些比较久的框架.Sun公司之后推出了一个新的标签使用方式,称之为简 ...