求小于n的所有不重复组合之和等于n

import java.util.Stack;
import java.util.Vector;

/*
* 该类实现了小于n的数的所有可能组合之和等于n
*/
public class TenTest {


public static void main(String[] args) {
int n = 10;
for(int i = 1;i<n;i++){
//用栈来存放数据,方便弹出
Stack<Integer> ve = new Stack<Integer>();
for(int j = i; j<n;j++){
ve.push(j);
int sum = 0;
for(int m= 0; m < ve.size(); m++){
sum = sum + ve.get(m);
}
if(sum == n){
System.out.println(ve);
ve.pop();
ve.pop();
continue;
}
//添加一个数之后,栈内数据之和大于n时,要考虑的情况
//之和大于等于n,弹出栈顶的两个元素
//还有添加一个数字后之和小于N,但添加下一个数之和大于n,所以弹出两个数,而有一种可能,去掉上一个数据
//加上本次数据,之和可能等于n,例如:234 235
if(sum > n){
ve.pop();
ve.pop();
ve.push(j);
sum = 0;
for(int k= 0; k < ve.size(); k++){
sum = sum + ve.get(k);
}
if(sum == n){
System.out.println(ve);
ve.pop();
}
if(sum > n){
ve.pop();
}
continue;
}

}
}


}
}

结果
[1, 2, 3, 4]
[1, 2, 7]
[1, 9]
[2, 3, 5]
[2, 8]
[3, 7]
[4, 6]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值