您的位置:首页 > 其它

1,2,5,10四个基数任意次数组合相加得到一个数N,求所有可能组合

2011-09-19 20:58 1256 查看
#include <iostream>
#include <vector>

using namespace std;
vector<int> vec;
const int a[4] = {1, 2, 5, 10};

//1,2,5,10四个基数任意次数组合相加得到一个数N,求所有可能组合。
//回溯,背包问题

void backup(int N)//总共k个数,和为N
{
if (N == 0)
{
vector<int>::iterator it = vec.begin();
for (; it != vec.end(); ++it)
cout<< *it <<" ";
cout<<endl;
return;
}

if (N < 0) return;

for (int i = 0; i < 4; ++i)
{
if (vec.empty() || a[i] >= vec.back())// 非降序,为了去掉重复的组合
{
vec.push_back(a[i]);
backup(N-a[i]);
vec.pop_back();
}
}
}

int main(int argc, char* argv[])
{
backup(20);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐