编程题:从n个数中选取m个数,计算m个数的和s,判断剩余n-m个数中是否存在等于s的数,如果存在,输出最大值
2018-04-04 10:14
423 查看
描述:从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);
}
}
}
}
例如:
输入: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); } } } }
相关文章推荐
- 判断字符串及其子串是否是包含回文字,如果包含输出长度。
- 作业四-1、输入2个正整数m和n(1≤m,n≤1000),输出m~n之间的所有水仙花数。水仙花数是指各位数字的立方和等于其自身的数。要求定义并调用函数is(number)判断number的各位数字之和是否等于其自身。
- java判断文件夹是否存在某一文件 如果存在就删除功能
- 原生js实现增加(addclass),删除(removeclass),判断是否存在(hasclass),如果存在删除,如果不存在添加(toggleclass)和获取类名(getbyclass)的方法
- 【41】递增数组判断是否存在两个树等于给定值
- 判断有序整型数组中是否存在两数,相加之和等于给定的任意整数
- 判断一个字符串是否是另一个字符串的左旋,如果是输出左旋的次数
- 提示用户输入一个用户名,判断是否存在,如果存在显示该用户的shell
- 3. 1.C语言和OC结合题目 // 从控制台输入用户名和密码, 然后 判断输入的用户名是否是@“Frank”, 密码 是否是 @“lanou”, 如果用户名和密码都正确,则输出登录成功
- 判断窗体是否存在,如果存在就激活
- 【转】通过文件锁实现,程序开始运行时,先判断文件是否存在,若存在则表明该程序已经在运行了,如果不存在就用open函数创建该文件,程序退出时关闭文件并删除文件
- MapReduce 判断输出路径是否存在问题
- 从键盘上接收一个字母,判断是否是大写字母,如果是则转换成小写字母输出 ,否则直接输出。
- mysql数据库表中判断字段是否存在,如果不存在则创建该字段
- oracle创建表之前判断表是否存在,如果存在则删除已有表
- 【41】递增数组判断是否存在两个树等于给定值
- 判断表是否存在,如果存在就删除然后重新创建。
- 12月27日任务 从键盘任意输入三角形的三边,判断是否能构成三角形,若能,则计算三角形的面积并输出,若不能,则输出不能构成三角形
- 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bccced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中
- 用c++编写一段完整代码,要求判断一个进程(例如qq.exe)是否存在,若存在,输出存在,不存在就输出不存在。