首页 > 试题广场 >

公平划分

[编程题]公平划分
  • 热度指数:1759 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

小爱和小溪有N个数字,他们两个想公平的分配这些数字。小爱拿的数字集合为I=「i1, i2, ik」,小溪获得剩下的J,J=「j1, j2, jn-k」。但是他们衡量分配公平与否的原则与众不同:

在小爱拿到其中的K个数字的前提下,计算出他们分配偏差f(I)的最小值


输入描述:
输入第一行两个数字,分别表示总的数字量N和小爱拿的数字量K。第二行有N个数字,表示每个数字的值。


输出描述:
输出一个数字,表示分配偏差f(I)的最小值。
示例1

输入

4 1
3 3 3 1

输出

2
import java.util.Scanner;



/*
 * @author Moze 2020
 * 此题目题量较小,使用穷举法可以求解。
 * 递归出共有2的N次方种情况,可以进行一些剪枝
 * 我只减去了最后小爱个数不等于k的就可以了
 * 注:个人感觉此题不能够用动态规划吧。
 * 原因:设index为止,小爱分了i个数,和index时刻小爱分了i个数还是i-1个数 并不能直接联系,必须等到最后时刻才能够确定
 */
public class Main {
	static int N;
	static int a[];
	static int k;
	static int min=Integer.MAX_VALUE;
	public static void main(String[] args) {
		Scanner aa= new Scanner(System.in);
		N = aa.nextInt();
		k = aa.nextInt();
		a=new int[N];
		for(int i=0;i<N;i++){
			a[i]=aa.nextInt();
		}
		m(0,new int[N],new int[N],0,0);
		System.out.println(min);
		
	}
	public static void m(int index,int[] xi,int[] ai,int num_xi,int num_ai){
		if(index == N){
			if(num_ai != k){
				return ;
			}
			int sum=0;
			for(int i=0;i<num_ai;i++){
				for(int j=0;j<num_xi;j++){
					sum+=Math.abs(ai[i]-xi[j]);
				}
			}
			min = Math.min(min, sum); 
			return ;
		}
		if(num_ai<k){
			ai[num_ai]=a[index];
			m(index+1,xi,ai,num_xi,num_ai+1);
		}
		xi[num_xi]=a[index];
		m(index+1,xi,ai,num_xi+1,num_ai);
	}
	
	
	
}



发表于 2020-06-26 20:41:18 回复(0)