求java用回溯法解决子集和问题

刘雁冰 2014-11-21 03:40:05
子集和问题:
问题描述:子集和问题的一个实例为<S,t>.其中,S={X1,X2,X3,……,XN}是一个正整数的集和,C是一个正整数。子集和问题判定是否存在S的一个子集S1,使得S1中的所有元素加起来正好等于C。
试设计一个解子集和问题的回溯法。
算法设计:对于给定的 S={X1,X2,X3,……,XN}和正整数C,计算S1,使得S1中的所有元素加起来正好等于C。
数据输入:从键盘输入两行数据,第一行有1个正整数C, C是子集和的目标值。接下来一行中有N个正整数,表示集合S中的元素。
结果输出:将子集和问题的所有解输出。当问题无解时,输出“No Solution!”
如:输入: 10
2 2 6 5 4
输出:2 2 6
6 4
...全文
680 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
AceShot 2014-11-21
  • 打赏
  • 举报
回复
我二了,S={X1,X2,X3,……,XN}集合中是不能有重复元素的 ,所有上面{226和{622}的情况是不会发生的(int[] input = {6,4,2,2,5,6,1};这个数据就有问题)。
AceShot 2014-11-21
  • 打赏
  • 举报
回复
这个方法还是有些小问题,将就着看看我的思路吧,,,{226和{622}会被当成不同子集,囧。至于“No Solution”输出可以加个标志位判断。
AceShot 2014-11-21
  • 打赏
  • 举报
回复

package com.huisu;

public class Main {
	public static void main(String[] args) {
		int[] input = {6,4,2,2,5,6,1};
		int[] record = new int[input.length];
		int key = 10;
		backtrack(input, record, key, 0, 0);
	}

	public static void backtrack(int[] input,int[] record,int key,int sum,int n) {
		if(n == input.length){
			return;
		}else{
			for(int i=0; i<=1; i++){
				sum += i*input[n];
				record[n] = i;
				if(sum == key){
					for(int j=0; j<=n; j++){
						if(record[j]==1)
							System.out.print(input[j]);
					}
					System.out.println();
				}
				if(sum<key){
					backtrack(input, record, key, sum, n+1);
				}
				sum -= i*input[n];
			}
		}
	}
}


//output
226
2251
46
451
622
64
输入就简单点了,不写scanner了
wyc_ 2014-11-21
  • 打赏
  • 举报
回复
如果数据不多,暴力就可以了。思路是这样的:可以用位也可以用数组标志对应的元素选或者不选。比如有5个数,定义一个数组a[6],如果第i个数选则a[i] = 1;暴力枚举所有的情况就可以了
刘雁冰 2014-11-21
  • 打赏
  • 举报
回复
没有源码有思路也可以

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧