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
这一套题做错了几次,按理说直接用等差数列求和公式就行了,主要是要考虑一些运算符的结核性问题: 四则运算符(+.-.*./)和求余运算符(%)结合性都是从左到右. 于是,我自己写了一个版本,主要是考虑( ...
随机推荐
- Heap(data structure)——堆(数据结构)(源自维基百科)
源地址:http://en.wikipedia.org/wiki/Heap_%28data_structure%29 在计算机科学领域,堆是指一个特定的基于数结构的数据结构,其必须满足堆属性: 如果A ...
- 网盘大全, 邮箱大全 good
网盘推荐 115网盘 注册 百度网盘 注册 微云 注册 360云盘 注册 金山快盘 注册 新浪微盘 注册 和彩云 注册 酷盘 注册 OneDrive 外链 BOX 注册 Dropbox 注册 国内网盘 ...
- Swift - 使用CGBlendMode改变UIImage颜色
类似于PS,Swift中也可对图片UIImage进行图层混合(blending),而且提供了相当丰富的混合模式(blendMode).本文先介绍使用其中的kCGBlendModeDestination ...
- poj3278Catch That Cow(BFS)
Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 37094 Accepted: 11466 ...
- 在Ubuntu 12.04下编译qtiplot
不在windows下,再加上不想用盗版,所以需要一个origin的替代品——qtiplot.虽然我非常抵抗用这种不停点来点去的软件,用R的ggplot2画图多好啊,高效.优雅.漂亮,但是终抵不过老板一 ...
- actor简介
今天抽时间,给team做了一次actor介绍,现附上ppt actor 简介及应用
- java学习笔记-继承中super关键字
背景: 在java继承的概念中我们得知,被声明为私有的类成员对所属的类来说仍然是私有的.类之外的任何代码都不能访问,包括子类. super关键字的两种用法: 1.用于调用超类的构造函数: 2.用于访问 ...
- 让程序在崩溃时体面的退出之Dump文件
在我的那篇<让程序在崩溃时体面的退出之CallStack>中提供了一个在程序崩溃时得到CallStack的方法.但是要想得到CallStack,必须有pdb文件的支持.但 ...
- 谷歌浏览器訪问不了啦,oh shit!
从这个礼拜開始,一直訪问不了谷歌.该死的,百度找的资料全然是牛头不正确马嘴 我也问了其它人.有的人也是打不开,蛋疼的 可是如今找到几种方法了,还真管用 第一种方法:加上ncr http://www.g ...
- C++学习之路—const用法总结
(根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) C++为什么要引入const?它允许你指定一个语 ...