1到n数组,和为指定数所有序列问题
(1)方法一,背包问题解法
#include <iostream>
using namespace std;
#include <vector>
#include <list> //采用背包问题方法,从后向前,最后一个放和不放背包里,注意递归退出条件和sum==n后,没有return而是继续
vector<int> a; //存背包 事实证明用vector就可以,也不用revers。 void subofsum(int sum,int n,bool &flag)
{
if(sum<=||n<=) //迭代退出条件
return;
if(sum==n)
{ for(vector<int>::iterator i=a.begin();i!=a.end();i++)
{
cout<<*i<<"+";
flag=true;
}
cout<<n<<endl; //注意n没有放入背包,而是输出了,而且后面没有return,让n接着放入背包,肯定不行,就会弹出北包,放subofsum(sum,n-1,flag); }
a.push_back(n);
subofsum(sum-n,n-,flag);
a.pop_back();
subofsum(sum,n-,flag);
} int main()
{
int sum=;
int n=;
bool flag=false;
subofsum(sum,n,flag);
if(flag==false)
{
cout<<"not found"<<endl;
}
system("PAUSE");
}
方法二:子集和问题方法,其实跟背包问题差不多。
自己实现的,原来看懂跟自己能写对差距好大啊,自己写就费了很大劲。真的要练习才行,光看是没用的,只能眼高手地。
问题:思路很简单,回溯方法,加上修建树枝。
我做的是t ,k ,当t+k==m,
t+k<m,t+k+1<=m&&t+r-k>=m
常规还可以用vector直接放每一个数字,而不是用类似bitmap方法,那种也可以直接用下面的改写,但是空间占用比较多。
#include <cstdlib>
#include <iostream>
#include <string.h> //memset must include string.h or ctring
using namespace std; /*
*
*/
void subofsum(int t,int k,int r,bool *array,int n,bool &flag,int sum)
{
// if(k>n) //这里开始担心k会越界,实际上不会,因为有剪支 // return;
//array[k]=true;
if(t+k==sum) //注意k没有至位
{
for(int i=;i<=n;i++) //注意这里是n,july写的是k,想得周到,但这是常规方法
{
if(array[i]==true)
{
cout<<i<<"+";
}
}
cout<<k<<endl; //cout k
flag=true;
return; //可以返回了
}
//array[k]=false; //这里往下有两种情况,都是针对t+k《m的情况,t+k如果大于m直接就跳过两个if了,也就是上面return了,一样。
if(t+k<sum) //只有当t+k《sum时才至位,上来就一直小于一直至位,知道发现不行了或等于了,推出上一层,看另外情况
{
array[k]=true; //k set 1
subofsum(t+k,k+,r-k,array,n,flag,sum);
array[k]=false; //k not set 1 ;normal 在把k恢复,这是常规方法
if(t+k+1<=sum&&t+r-k>=sum) //另一种情况
35 {
37 subofsum(t,k+1,r-k,array,n,flag,sum);
38 }
}
} int main(int argc, char** argv) { int sum=;
int n=;
cout<<"sum= "<<"n= "<<endl;
cin>>sum>>n;
if(n<=0||sum<=0) //这里只有当n《=0时,说明错了,sum可以比n小,也可以比n大,但是sum不能是负数
return ;
bool * array=new bool[n+];
//bool array[10]={0};
memset(array,,sizeof(bool)*(n+));
bool flag=false;
int r=n*(n+)/;
subofsum(,,r,array,n,flag,sum);
if(!flag)
cout<<"nof found"<<endl;
return ;
}
july博客方法实现
void subofsum(int t,int k,int r,bool *array,int n,bool &flag,int sum)
{
// if(k>n) //because have cut ,so k won't > n,k not set 1
// return;
array[k]=true; //注意上来就至位了
if(t+k==sum)
{
for(int i=;i<=k;i++) //这是关键,只是到k,因为上来就至位,又没有恢复,就会导致后面可能还有1,所以他只用到k,很巧妙,但不常见
{
if(array[i]==true)
{
cout<<i<<""; //最后会多输出一个空格
}
}
cout<<endl;
flag=true;
return;
}
else //else可以不用写,上面return了,就算不return也可以不用写else,因为如果上面成立,下面都不会成立
{
if(t+k+k+<=sum) //多看个k+1
{
subofsum(t+k,k+,r-k,array,n,flag,sum);
}
if(t+k+<=sum&&t+r-k>=sum)
{
array[k]=false;
subofsum(t,k+,r-k,array,n,flag,sum);
}
}
}
总结:一定要自己动手实习,这样才能真正弄明白自己,可能之前一直没注意到的细节,不能眼高手地啊!
1到n数组,和为指定数所有序列问题的更多相关文章
- PHP 数组中取出随机取出指定数量子值集
#关键:array_rand() 函数返回数组中的随机键名,或者如果您规定函数返回不只一个键名,则返回包含随机键名的数组.#思路:先使用array_rand()随机取出所需数量键名,然后将这些键名指向 ...
- 评playerc网友的"求比指定数大且最小的“不重复数”问题"
问题见:对Alexia(minmin)网友代码的评论及对“求比指定数大且最小的‘不重复数’问题”代码的改进 .算法:求比指定数大且最小的“不重复数”问题的高效实现 . playerc网友的代码如下(求 ...
- 对Alexia(minmin)网友代码的评论及对“求比指定数大且最小的‘不重复数’问题”代码的改进
应Alexia(minmin)网友之邀,到她的博客上看了一下她的关于“求比指定数大且最小的‘不重复数’问题”的代码(百度2014研发类校园招聘笔试题解答),并在评论中粗略地发表了点意见. 由于感觉有些 ...
- 获得32位UUID字符串和指定数目的UUID
在common包中创建类文件UUIDUtils.java package sinosoft.bjredcross.common; import java.util.UUID; public class ...
- 《剑指offer》— JavaScript(32)把数组排成最小的数
把数组排成最小的数 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为3213 ...
- JS案例之8——从一个数组中随机取数
近期项目中遇到一个需求,从一个列表中随机展示列表的部分内容,需求不大,JS也非常容易实现.主要是运用到了Math对象的random方法,和Array的splice方法. 思路是先新建一个数组,存放所有 ...
- 九度OJ 1504 把数组排成最小的数【算法】-- 2009年百度面试题
题目地址:http://ac.jobdu.com/problem.php?pid=1504 题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如 ...
- splice从数组中删除指定定数据
/*从数组中删除指定定数据var somearray = ["mon", "tue", "wed", "thur"]so ...
- 每日分享!~ JavaScript(js数组如何在指定的位置插入一个元素)
这个想法是在一个面试题中看到的: 题目是这样的: // 一个数组,在指定的index 位置插入一个元素,返回一个新的数组,不改变原来的数组 <script> function inse ...
随机推荐
- Java线程(转)
1.Java线程的实现. 第一种方式可以通过继承Thread.在Thread类中,有许多关于线程操作的方法,比如:sleep();activeCount();等 继承Thread的代码: public ...
- 一步步学习ASP.NET MVC3 (10)——@Ajax,JavaScriptResult(1)
请注明转载地址:http://www.cnblogs.com/arhat 首先老魏先说一下抱歉,昨天由于在安装CentOS,Mono,Jexus配置Linux环境下的ASP.NET运行环境,花费了不少 ...
- python 读写文本文件
本人最近新学python ,用到文本文件的读取,经过一番研究,从网上查找资料,经过测试,总结了一下读取文本文件的方法. 1.在读取文本文件的时无非有两种方法: a.f=open('filename', ...
- apache+tomcat 负载均衡
说明:本篇不面向无开发基础的人员,所以不会有软件下载,jdk安装等步骤.比较久远的东西了...... 1.系统环境 win7-64.jdk 2.软件列表: apache_2.2.24-x64-no-s ...
- jQuery CSS 添加/删除类名
addClass(class) — 为每个匹配的元素添加指定的类名.参数 : class — 一个或多个要添加到元素中的CSS类名,请用空格分开(String)示例 一 :为匹配的元素加上 'sele ...
- 几个不常见但非常出色的 .NET 开源库
NLog NLog 目前最为出色的 .NET 日志库,非常容易配置,且极具灵活性.最重要的是与 log4net 相比,NLog 的开发很活跃.顺带提一句,NLog 完全兼容 Mono. Mono.Ce ...
- Winform datagridview相关操作
datagridview显示行号的2种方法: 方法一: 网上最常见的做法是用DataGridView的RowPostPaint事件在RowHeaderCell中绘制行号: privatevoiddat ...
- HDU 1166 敌兵布阵(线段树 单点更新)
点我看题目 题意 :HDU的中文题也不常见....这道题我就不详述了..... 思路 :这个题用线段树用树状数组都可以,用线段树的时候要注意输入那个地方,输入一个字符串的时候不要紧接着输入两个数字 ...
- 上海CEC大收购(包括华大九天)
紫光收购展讯.锐迪科后,上海开始通过扶植CEC培育新势力,CEC已经收购上海澜起,即将收购amlogic.Ominivision,还在与marvell眉来眼去,此外华大九天已经移植上海,加上之前的上海 ...
- Myeclipse开发内存溢出问题
MyEclipse开发内存溢出问题 window --> preferences --> MyEclipse --> servers --> Tomcat --> J ...