33,010
社区成员
发帖
与我相关
我的任务
分享
// [10/8/2013 qingezha]给定一个数和一个数组,输出这个数组中若干个元素和为给定的那个数的所有情况
void find_factor(int sums, int *arr,int *end)//加数替换为一个数组arr
{
// 递归出口
if(arr == end) //这里很重要,不像字符串,有'\0'结束标志,
return; //整数没有,所以用arr+sizeof(arr)/sizeof(int)表示地址
// 输出找到的结果
if(sums == *arr)
{
// 反转list
list1.reverse();
cout<<ie++;
for(list<int>::iterator iter = list1.begin(); iter != list1.end(); iter++)
cout<<" "<< *iter << " + ";
cout<<*arr;
cout << endl;
list1.reverse();
}
list1.push_front(*arr); //典型的01背包问题
find_factor(sums-*arr, arr+1,end); //放n,n-1个数填满sum-n
list1.pop_front();
find_factor(sums, arr+1,end); //不放n,n-1个数填满sum
}
/**
现有整型数组y{1,2,4,3,5,8},写出一个函数,找出所有和为10的集合
**/
#include <vector>
#include <iostream>
#include <algorithm>
void print(std::vector<int>& vec)
{
if(!vec.empty())
{
std::for_each(vec.begin(),vec.end(),[](const int& val)
{
std::cout<<val<<" ";
}
);
std::cout<<std::endl;
}
}
void fun(int*begin,int* end,std::vector<int>& vec,int sum)
{
if(begin==end && sum==0)
{
print(vec);
}
else if(begin==end)
{
return ;
}
else
{
if(sum>=*begin)
{
vec.push_back(*begin);
fun(begin+1,end,vec,sum-*begin);
vec.pop_back();
}
fun(begin+1,end,vec,sum);
}
}
int main(int argc,char* argv[])
{
std::vector<int> vec;
int arr[]={1,2,4,3,5,8};
fun(arr,arr+sizeof(arr)/sizeof(int),vec,10);
system("PAUSE");
return 0;
}
1 4 65
2 3 65
5 65
4 32 34
1 3 32 34
2 4 3 5 8 14 34
#include <stdio.h>
int main(int argc, char* argv[])
{
int arr[]={1,2,4,3,5,8};
int len=sizeof(arr)/sizeof(arr[0])-1;
for(int indx=0;indx<(2<<len);++indx){
int sum=0,t=0,i=indx;
while(i) {
sum+=arr[t]*(i%2);
i/=2,t++;
}
if(sum==10) {
i=indx,t=0;
while(i) {
if(i%2) printf("%d ",arr[t]);
i/=2,t++;
}
printf("\n");
}
}
return 0;
}