寻找接近给定和的若干个数

问题描述:有n个正整数, 按从小到大的顺序升序排列, 现给定一个实数m, 请从数组中找出若干个数, 满足这若干个数的和与m最为接近.

问题分析:该问题实际是背包问题的一个变种. 考虑是否取当前数的策略, 问题可以转化为取当前值和不取当前值的区别.

  • 如果取当前值, 算法为 sumAppFix(m, sum+a[i]).
  • 如果不取当前值, 算法为sumAppFix(m, sum).

参考java代码如下:
private static Stack<Integer> stack = new Stack<Integer>();
private static Stack<Integer> min_stack = new Stack<Integer>(); 
public static int[] sumAppFix = {1,4,5,6,10};
public static int min_diff = sumAppFix[sumAppFix.length-1];

public static void sumAppFix(int M, int index, int curSum){
     // 若当前和与m的差值小于最小差值, 更新最小差值为当前差值. 并将栈内元素保存在最小栈中.        
	if(Math.abs(M - curSum) < min_diff){  
		min_diff = Math.abs(M - curSum);
		min_stack = (Stack<Integer>) stack.clone();
	}
	
	// 若索引大于数组长度, 返回
	if( index >= sumAppFix.length){ 
		return;
	}
        
	stack.push(sumAppFix[index]);                   // 如果包含当前元素,将其压入栈中.
	sumAppFix(M, index+1, curSum+sumAppFix[index]); // 若当前元素包含在内, 判断下一个元素.
	stack.pop();                                    // 若不包含当前元素, 将其从栈中删除.
	sumAppFix(M, index+1, curSum);                  // 若不包含当前元素, 判断下一个元素.

}
// 测试函数
public static void main(String[] args) {
	sumAppFix(20, 0, 0);
	for ( int i:min_stack){
		System.out.println(i);
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值