描述:从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);
}
}
}
}