有一堆数,怎么在这堆数种找出几个数使他们的和为N

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有一堆数,怎么在这堆数种找出几个数使他们的和为N相关的知识,希望对你有一定的参考价值。

假设数组是1,3,2,6,4,5 怎么找出其中的几个数使他们的和为7.。
能找出来输出YES。。不能输出NO。。
求算法,最好带着代码。。
求高效的算法。。 在ACM中 一楼的肯定会超时的。如果有N个数,两个的得算(n-1)*n/2遍。。三个的(n-1)*(n-2)/2…如果N很大 计算量是很大的。。听一些人说可以用背包做,但是不知道怎么用。。

参考技术A #include <stdio.h>

int main( )

int a[]=1,3,2,6,4,5;
int flag=0,i,j,k,r,s;
for(i=0;i<6;i++)
for(j=i+1;j<6;j++)

if((a[i]+a[j])==7)

printf("Yes!2个数:%d+%d\n",a[i],a[j]);
flag=1;

for(k=j+1;k<6;k++)

if((a[i]+a[j]+a[k])==7)

printf("Yes!3个数:%d+%d+%d\n",a[i],a[j],a[k]);
flag=1;


for(r=k+1;r<6;r++)

if((a[i]+a[j]+a[k]+a[r])==7)

printf("Yes!4个数:%d+%d+%d+%d\n",a[i],a[j],a[k],a[r]);
flag=1;


for(s=r+1;s<6;s++)

if((a[i]+a[j]+a[k]+a[r]+a[s])==7)

printf("Yes!5个数:%d+%d+%d+%d+%d\n",a[i],a[j],a[k],a[r],a[s]);
flag=1;






if(flag==0)
printf("NO!\n");
return 0;

大致就是2个相加,3个相加,一直到5个相加判断和是否为7,做的比较简单。
参考技术B 应该先排序,后计算吧!

找出一堆数中最小的前K个数

描写叙述:

给定一个整数数组。让你从该数组中找出最小的K个数

思路:

最简洁粗暴的方法就是将该数组进行排序,然后取最前面的K个数就可以。

可是,本题要求的仅仅是求出最小的k个数就可以,用排序能够但显然有点浪费。比方让求10000个整数数组中的最小的10个数。用排序的话平均时间复杂度差为Nlog(N)。

于是想到了,用堆来实现,可是自己实现又太麻烦。想到了java里面的TreeSet,先将K个数放入TreeSet中。因为TreeSet会对里面的元素进行排序。所以在TreeSet中的元素是有序的。以后没插入一个元素,将TreeSet中的最大元素删除就可以,所以TreeSet动态维持K个元素且这K个元素是有序的。

代码:

import java.util.TreeSet;

public class FirstKElements
{
	public static TreeSet<Integer>getFirstKElements(int arr[],int k)
	{
		TreeSet<Integer>set=new TreeSet<Integer>();
		int len=arr.length;
		k=k%len;
		int i=0;
		int num=0;
		for(i=0;i<k;i++)
			set.add(arr[i]);
		for(i=k;i<len;i++)
		{
			set.add(arr[i]);
			num=set.last();
			set.remove(num);
		}
		return set;
	}
	public static void main(String[] args)
	{
		// TODO Auto-generated method stub
		int arr[]={9,7,5,4,2,1,3,6,8};
		System.out.println(FirstKElements.getFirstKElements(arr, 4));
	}

}
结果:

技术分享


以上是关于有一堆数,怎么在这堆数种找出几个数使他们的和为N的主要内容,如果未能解决你的问题,请参考以下文章

如何从一堆数中选出若干个数,使其和等于给定的数?

从一堆数中随机取出几个数

java从一堆数中找出和已知数最接近的数

[CF55D]Beautiful numbers(数位dp,状态压缩)

求出一堆数中和等于m的所有可能组合 JAVA

POJ_3663_贪心