编程题:从n个数中选取m个数,计算m个数的和s,判断剩余n-m个数中是否存在等于s的数,如果存在,输出最大值

描述:从n个数中选取m个数,计算m个数的和s,判断剩余n-m个数中是否存在等于s的数,如果存在,输出最大值。第一行输入n和m值,第二行输入n个数,输出最大值。

例如:

输入:6 2

          1 2 5 3 7 4

输出:7

分析:1+2=3;2+5=7;2+3=5;3+4=7;1+3=4;1+4=5        其中最大值为7

代码如下:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main
{
	
	public static int maxSum;
	public static int index;
	
    public static void main(String[] args)
    {
        Scanner sc =new Scanner(System.in);
        int n=0;
		int m=0;
		String[] str=sc.nextLine().trim().split(" ");
		for(int i=0;i<2;i++)
		{
			n =Integer.parseInt(str[0]);
			m =Integer.parseInt(str[1]);
		}
		//获取第二行输入的数据
		String[] str1=sc.nextLine().trim().split(" ");	
		List<Integer> beginList=new ArrayList<Integer>();
		for(int i=0;i<str1.length;i++)
		{
			beginList.add(Integer.parseInt(str1[i]));
		}	
		//数组排序,从最小到最大
		int temp=0;
		for(int i=0;i<n;i++)
		{
			for(int j=i+1;j<n;j++)
			{
				if(beginList.get(i)>beginList.get(j))
				{
					temp=beginList.get(j);
					beginList.set(j, beginList.get(i));
					beginList.set(i, temp);
				}
			}
		}
		
		int[] iTemp=new int[m];
		computeNum(beginList,n,m,0,iTemp,0);
		//打印结果值
		System.out.println(maxSum);
		
		
    }
    //从n个数中选m个数,使其和等于剩余n-m数中的数,输出最大数
    public static void computeNum(List<Integer> originList,int n,int m,int startIndex,int[] iTemp,int arrIndex)
    {    
    	int sum=0;
    	if(m==0)
    	{		
    		for(int j=index+1;j<n;j++)
    		{
    			for(int i=0;i<iTemp.length;i++)   //计算m个值的和
    			{
    				sum+=iTemp[i];
    			}
    			if(sum==originList.get(j))
    			{
    				maxSum=originList.get(j);
    				break;
    			}else if(sum<originList.get(j))   //如果小于,之后就不要考虑了了,结束循环
    			{
    				break;
    			}
    		}
    		
		}else
		{
			//递归遍历,从n个数选m个数的组合
			int endIndex=n-m;
	    	for(int i=startIndex;i<=endIndex;i++)
	    	{
	    		iTemp[arrIndex]=originList.get(i);
	    		index=i;
	    		computeNum(originList,n,m-1,i+1,iTemp,arrIndex+1);
	    	}
		}
    	
     }
}
package myPackage;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main
{
	
	public static int maxSum;
	public static int index;
	
    public static void main(String[] args)
    {
        Scanner sc =new Scanner(System.in);
        int n=0;
		int m=0;
		String[] str=sc.nextLine().trim().split(" ");
		for(int i=0;i<2;i++)
		{
			n =Integer.parseInt(str[0]);
			m =Integer.parseInt(str[1]);
		}
		//获取第二行输入的数据
		String[] str1=sc.nextLine().trim().split(" ");	
		List<Integer> beginList=new ArrayList<Integer>();
		for(int i=0;i<str1.length;i++)
		{
			beginList.add(Integer.parseInt(str1[i]));
		}	
		//数组排序,从最小到最大
		int temp=0;
		for(int i=0;i<n;i++)
		{
			for(int j=i+1;j<n;j++)
			{
				if(beginList.get(i)>beginList.get(j))
				{
					temp=beginList.get(j);
					beginList.set(j, beginList.get(i));
					beginList.set(i, temp);
				}
			}
		}
		
		List<Integer> iTemp =new ArrayList<Integer>();
		computeNum(beginList,n,m,0,iTemp);
		//打印结果值
		System.out.println(maxSum);
		
		
    }
    //从n个数中选m个数,使其和等于剩余n-m数中的数,输出最大数
    public static void computeNum(List<Integer> originList,int n,int m,int startIndex,List<Integer> iTemp)
    {    
    	int sum=0;
    	if(m==0)
    	{		
    		for(int j=index+1;j<n;j++)
    		{
    			for(int i=0;i<iTemp.size();i++)   //计算m个值的和
    			{
    				sum+=iTemp.get(i);
    			}
    			if(sum==originList.get(j))
    			{
    				maxSum=originList.get(j);
    				break;
    			}else if(sum<originList.get(j))   //如果小于,之后就不要考虑了了,结束循环
    			{
    				break;
    			}
    		}
    		
		}else
		{
			//递归遍历,从n个数选m个数的组合
			int endIndex=n-m;
	    	for(int i=startIndex;i<=endIndex;i++)
	    	{
	    		iTemp.add(originList.get(i));
	    		index=i;
	    		computeNum(originList,n,m-1,i+1,iTemp);
	    		iTemp.remove(iTemp.size()-1);
	    	}
		}
    	
     }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

年轮陌羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值