五个整数任意组合(加减)得到1~122之间的数
2017-03-13 16:17
260 查看
/问题描述
/*
给定五个整数1,3,9,27,81,这个五个整数可以任意组合进行加减(可以是五个数中的部分相加),这五个数组合进行加减可以得到1~122之间的数, 任意输入1~122之间的一个整数,得到其相应的组合,并且按照由大到小的顺序输出其表达式
示例输入输出
输入:5
输出:9-3-1
*/
之前写过一个华为上机题,五个数字相加任意组合成1~122之间的数,这几天看到了,感觉当时写的方法太挫了,居然是利用多层循环,那如果有更多数,或者数字个数不确定,那不就没辙了。
利用循环实现:
对于这个数字任意组合,很容易想到的就是排列组合(输出n个数字的所有排列)。类似,就可以用回溯的方法来实现。这里回溯其实也就是直接搜索,执行过程与利用多层循环实质相同,但对于解决问题比多层循环的挫办法要实用得多。
代码与求n个数字的排列类似,也是到达最里面一层判断是否满足条件,否则返回上一层,并更改这一层的状态,继续往下一层走。
[cpp] view
plain copy
#include <iostream>
using namespace std;
int weights[5] = {81,27,9,3,1};
void combine(int n, int sign[], int value)
{
if (n == 5)
{
int sum = 0;
for (int i = 0; i < 5; i++)
{
int tmp = weights[i]*sign[i];
sum += tmp;
}
if (sum == value)
{
//输出
bool flag = false;
for (int j = 0; j < 5; j++)
{
if (sign[j] != 0)
{
if (sign[j] == 1)
{
if (flag)
{
cout << "+";
}
cout << weights[j];
}
else if (sign[j] == -1)
{
cout << "-" << weights[j];
}
flag = true;
}
}
cout << endl;
}
}
else
{
sign
= 0; combine(n+1, sign, value);
sign
= 1; combine(n+1, sign, value);
sign
= -1; combine(n+1, sign, value);
}
}
int main()
{
int Value;
int sign[5];
while(cin>>Value)
{
combine(0, sign, Value);
}
return 0;
}
当输入的数不再是5个二是任意个数时该怎么解决(留个小问题)??
相关文章推荐
- 五个整数任意组合(加减)得到1~122之间的数
- 有5个砝码 分别是1,3,9,27,81 可以组合成1--121之间任意整数
- JAVA 有5个砝码 分别是1,3,9,27,81 可以组合成1--121之间任意整数
- c语言编程 有5个砝码 分别是1,3,9,27,81 可以组合成1--121之间任意整数
- c语言编程 有5个砝码 分别是1,3,9,27,81 可以组合成1--121之间任意整数
- 任意非负整数,求1~n之间含有1的整数的个数
- 在有限多的不大于100的正整数中,找出尽量多个相加起来值介于98~102之间的组合
- 在有限多的不大于100的正整数中,找出尽量多个相加起来值介于98~102之间的组合
- 四个基数任意次数组合相加得到一个数N,求所有可能组合
- 写正确函数需要注意的地方:两个序列a,b,大小都为n,序列元素的值为任意整数,无序;要求通过交换a,b中的元素,使序列a元素的和与序列b元素的和之间的差最小
- 一个朋友面试时遇到的算法题(怎么组合后得到最大整数)
- 《数组-规划》 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小
- 输入任意一个数,得到1到这个数之间的1的个数
- 基础算法测试——生成一个1-10之间的随机整数组合
- 给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
- mssql任意连续整数之间的的乘积
- 一个有序正整数集S,若要保证整数集中所有的数通过组合(相加)可以表示1~N中任意一个正整数
- 在有限多的不大于100的正整数中,找出尽量多个相加起来值介于98~102之间的组合
- 基础算法测试——生成一个1-10之间的随机整数组合