递归最大数求和
Recursive max numbers summing
我遇到了求和问题的递归求解问题。问题是:对于给定的m和n,制作一个程序,将n个数相加为m,从而使用最小数,并且它们是。有多种解决方案,正确的解决方案就是使用更大数字的解决方案。用户输入n、m和n个数字。例如:m=19 n=4 8,5,4,1。解决方案是8+5+5+1。如果我用数组中的下一个数字调用函数,并在其小于和的时候将其相加,那么只有当数组中的接下来的数字加起来可以达到m时,才能找到解决方案。如果问题是这样的:m=28 n=3 8,7,5解决方案是8+8+7+5,但我的程序会进行8+8+8,尝试将7或5相加,结果会崩溃,因为它们都不能容纳28。所以我的问题是回到两个多步骤。我可以从8+8+7到8+8+8,但可以;t回到8+8。这与背包问题相似,只是它更简单。很抱歉到目前为止没有包括我的代码:
#include <iostream>
#include <vector>
using namespace std;
void outputt(vector<int>);
int x(int m,vector<int> s,int n,int u)
{
static int sum=0;
static int level=0;
static vector<int> p;
sum+=s[u];
p.push_back(s[u]);
if(level==((n-u)+1))
{
p.pop_back();
level=0;
x(m,s,n,u-1);
}
if(sum>m)
{
level++;
sum-=s[u];
p.pop_back();
x(m,s,n,u+1);
}
if(sum==m)
{
outputt(p);
return sum;
}
else
x(m,s,n,u);
level++;
if(level>n-1)
outputt(p);
if(sum==m)
return sum;
else
{
cout<<"....";
x(m,s,n,level);
}
}
void outputt(vector<int> x)
{
for(vector<int>::iterator i=x.begin();i!=x.end();++i)
cout<<*i<<" ";
}
int main()
{
int m,n;
cin>>m>>n;
int z;
vector<int> p;
for(int i=0;i<n;++i)
{
cin>>z;
p.push_back(z);
}
cout<<x(m,p,n,0);
system("PAUSE");
}
输出有问题,但现在这并不重要。
这离您需要的位置不远了,这将尽快找到解决方案(迭代次数最少),而不是最浅的解决方案。
#include <deque>
#include <iostream>
#include <iterator>
#include <algorithm>
template <typename IT, typename IT2>
bool perm_find(int num, IT start, IT last, IT2 output)
{
for(IT first=start; first!=last; ++first)
{
int t=num-*first;
if(t==0
||(t>0 && perm_find(t, start, last, output)))
{
*output++=*first;
return true;
}
}
return false;
}
int main()
{
int num;
std::deque<int> pallet, results;
std::cout << "Enter M: " << std::endl;
std::cin >> num;
std::cout << "Enter N vals: " << std::endl;
std::copy(std::istream_iterator<int>(std::cin),
std::istream_iterator<int>(),
std::back_inserter(pallet));
std::sort(pallet.rbegin(), pallet.rend());
perm_find(num, pallet.begin(), pallet.end(),
std::back_inserter(results));
std::copy(results.begin(), results.end(),
std::ostream_iterator<int>(std::cout, ", "));
return 0;
}
要修改它,使其尽可能短,您需要使用dijstras-algo之类的东西来完成每个有效的组合。
EDTT:有一个错误,我现在已经修复了
一些建议:
- 避免递归代码中的静态(可以使用它进行调试),让函数的每个实例尽可能独立
- 循环遍历函数(x)中的所有数字,以回溯到最优解
- 将数字作为常量引用传递,因为它们无论如何都不会更改
- 还传递(作为值)一个包含已选择数字的容器(尝试),所以当返回时,您将继续上一次尝试(回溯)。这应该是你的实际状态
- 总和为std::accumulate(attempt.begin(),attempt.end(),0)
- 级别为try.size()
- 首先对你的数字进行降序排序,得到最小的数字
- 如果以后需要,返回尝试向量(现在不总是返回总和)
相关文章:
- 使用192/256位整数求和无符号64位整数向量的点积的最快方法
- 在高通六边形处理器的word32上执行水平求和的最快方法是什么
- 找到不大于 A 的最大数的最有效方法,该数可被 B 整除
- C++:最大数组值函数工作不正常
- 在浮点数32中保存浮点数16最大数
- 使用 DP 的非相邻元素的最大数组总和
- 找到第 n 个最大数无限循环C++
- 最大数组大小
- C 最大数组大小
- 如何在GPU内存中获取最大数组大小
- 具有最大数组函数的程序
- 这是在包含非唯一元素的未排序数组中选择第k个最大数的最快算法
- 如何递归地找到最大数组元素的索引
- 递归最大数求和
- 如何找到数组中的最大数并用c++显示
- 给定一系列整数,提供第k个最大数
- 在任意加长的集合中查找最大数不起作用
- IEEE 754浮点数,1<的最大数是多少?
- 不与V互质的最大数
- C++是否有最大数组长度限制