一道小巧的编程难题(高手进,请教思路)

thinkperson_t500 2012-05-09 11:21:38
加精
现有整型数组{1,2,4,3,5,8},写出一个函数,找出所有和为10的集合。
...全文
18030 227 打赏 收藏 转发到动态 举报
写回复
用AI写文章
227 条回复
切换为时间正序
请发表友善的回复…
发表回复
ayong95 2014-03-12
  • 打赏
  • 举报
回复
牛人真多,哈哈
MBSHENG 2014-03-11
  • 打赏
  • 举报
回复
11L正解
11L的方法是遍历所有的可能,不用排序
SmallBoat2000 2014-02-14
  • 打赏
  • 举报
回复
void f() { cout<<"{1,2,3,4}"<<endl; cout<<"{1,4,5}"<<endl; cout<<"{2,3,5}"<<endl; cout<<"{2,8}"<<endl; }
一起来玩玩呗 2013-11-02
  • 打赏
  • 举报
回复
可以逆向来考虑,将10 拆分成10个1 相加,然后进行组合,组合条件是1,2,3,4,5,8; 问下允许出现重复的情况吗,比如2个5相加
kernelkoder 2013-10-24
  • 打赏
  • 举报
回复
引用 10 楼 mougaidong 的回复:
带剪枝的子集和算法
关于剪枝算法,有没有什么书可以推荐?
cdsnfresh 2013-10-17
  • 打赏
  • 举报
回复
引用 1 楼 thefirstz 的回复:
方法1:将数组排序,然后从两端分别向前推进,伪代码如下: while(end > start) { if(intArray[start] + intArray[end] == 10){output; start++; end--;} else if(intArray[start] + intArray[end] > 10) { end-- ;} else { start++;} } 方法2:用辅助数组k[],初始化为0.遍历一次这个整形数组,把数组元素大小作为下标,k[intArray[i]]=1,实现初始化辅助数组,当查找时再遍历一次,如看到第二个元素2,因为k[2]=1,只需要看k[8]是否为1,为1说明8也存在,输出,为0,说明8不存在
这错的很典型吧
Sky丶Memory 2013-10-15
  • 打赏
  • 举报
回复
01背包问题吧
Solar-Rain 2013-10-10
  • 打赏
  • 举报
回复
递归处理 先求和为10的集合,把1先加进去 function(1,10) 再在剩下的数里,找和为10-1=9的集合,先找到2,加进去 function(2,9) function(4,7) function(3,3) 这样就满足了第一个集合(1,2,4,3) 返回上一层 function(4,7) 依次加入5,和8都不满足,再返回上一层 function(2,9) 依次执行,加入3,5,8都不满足,再返回上一层 function(1,10) 加入4 function(4,9) 加入3后无解,在返回到这一层,加入5, function(5,5) 得到第二个解(1,4,5) 这样递归循环处理后就可以得到全部解了
qingen123 2013-10-08
  • 打赏
  • 举报
回复
//  [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  
}
leewon1988 2013-10-04
  • 打赏
  • 举报
回复
/**
现有整型数组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;
}
bigwangdi 2013-10-04
  • 打赏
  • 举报
回复
回溯!!!!!!!!!!!!
阿麦 2013-09-04
  • 打赏
  • 举报
回复
这是一个NP难度难度
鉴定完毕。
橡皮擦 2013-09-04
  • 打赏
  • 举报
回复
循环,依次让10减去每个数字,得到差值,然后查找数组中是否存在该差值就好了
O西瓜 2013-09-03
  • 打赏
  • 举报
回复
题目要求是求出所有结果,所以贪心和DP都可以扔到一边去,正确解法应该是 排序+分支界限+剪枝
zhangchenglong82 2013-08-03
  • 打赏
  • 举报
回复
暴力一下:) #include<iostream.h> int main() { int a[] ={1,2,4,3,5,8}; int i; int j; int k; int m; int n; // 2个数的 for (i = 0; i < 5; i++) { for (j = i + 1; j < 6; j++) { if ((a[i] + a[j]) == 10) { cout<<a[i]<<" ,"<<a[j]<<endl; } } } // 3个数的 for (i = 0; i < 4; i++) { for (j = i + 1; j < 5; j++) { for (k = j + 1; k < 6; k++) { if ((a[i] + a[j] + a[k]) == 10) { cout<<a[i]<<" ,"<<a[j]<<" ,"<<a[k]<<endl; } } } } // 4个数的 for (i = 0; i < 3; i++) { for (j = i + 1; j < 4; j++) { for (k = j + 1; k < 5; k++) { for (m = k + 1; m < 6; m++) { if ((a[i] + a[j] + a[k] + a[m]) == 10) { cout<<a[i]<<" ,"<<a[j]<<" ,"<<a[k]<<" ,"<<a[m]<<endl; } } } } } // 5个数的 for (i = 0; i < 2; i++) { for (j = i + 1; j < 3; j++) { for (k = j + 1; k < 4; k++) { for (m = k + 1; m < 5; m++) { for (n = m + 1; n < 6; n++) { if ((a[i] + a[j] + a[k] + a[m] + a[n]) == 10) { cout<<a[i]<<" ,"<<a[j]<<" ,"<<a[k]<<" ,"<<a[m]<<" ,"<<a[n]<<endl; } } } } } } int sum = 0; for (i = 0; i < 6; i++) { sum += a[i]; } if (10 == sum) { for (i = 0; i < 6; i++) { cout<<a[i]<<" ,"; } } cout<<endl; return 1; }
yoyowinwin 2013-06-09
  • 打赏
  • 举报
回复
使用 #110 楼的数据: 数组定义为{ 1 , 2 , 4 , 3 , 5 , 8 , 65 , 32 , 14 , 34},和为70。 运行前面的程序,只需2^10 =1024次: 答案:
1 4 65
2 3 65
5 65
4 32 34
1 3 32 34
2 4 3 5 8 14 34
yoyowinwin 2013-06-09
  • 打赏
  • 举报
回复
总只需 循环 2^6 =64 次
yoyowinwin 2013-06-09
  • 打赏
  • 举报
回复
brute force 啊。
#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;
}
u010896833 2013-05-31
  • 打赏
  • 举报
回复
真是服了,这么简单的问题,一个比一个扯。 #include<stdio.h> #include<stdlib.h> int main() { int j[5]={2,2,4,6,8}; int c=0,o=0; int l=5,oo=5; while(l--){ while(oo--){ if(j[c]+j[o]==10)printf("%d,%d\n",j[c],j[o]); o++; } o=0; oo=4; c++; } system("pause"); }
木子十甫寸 2012-09-24
  • 打赏
  • 举报
回复
只能处理两个数的和?

[Quote=引用 1 楼 的回复:]

方法1:将数组排序,然后从两端分别向前推进,伪代码如下:
while(end > start)
{
if(intArray[start] + intArray[end] == 10){output; start++; end--;}
else if(intArray[start] + intArray[end] > 10……
[/Quote]
加载更多回复(172)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧