交换左右子树的递归算法,
1) 最小的权值的几个( 1, 2, 3, 4)
2) 假设当前(甲,乙,丙,丁),如果我们能确定权值和刚好大过它的组合,不难找到所有组合按权值和排序
数据结构
需要两个结构选择和保留,选择是已经选择的子集合,遗体是要考虑的数
他们是列表并需要排序,先开始元素放置如下
算法
1) 用残余中最小的元素到选择中找到刚好它能大过的元素
2) 如果找到,交换这两个元素
3) 如果不能找到,从残余中删除此元素,取下一个元素继续找(就是到1) )
-能找到的情况
选择
包com。PNP。findnextnumber
导入Java。util。ArrayList
导入Java。util。收藏;
公共类NextWeighSum
ArrayList Integer remains=new ArrayList Integer
数组列表整数选择=新数组列表整数
int TOTAL _ COUNT=10
int SELECT _ COUNT=4;
void init() {
for(int I=0;一.总数我)
遗体。添加(I 1);
收藏。分类(遗体);
for(int I=0;我选择_计数;我)
选择。添加(剩余部分。删除(0));
}
/*
*选择给定子集,需要返回权重和刚好大于当前子集的下一个子集
*/
布尔选择下一个(){
while( remains.size() 0) {
int cur=剩余。get(0);
int pos=集合。二分搜索法(选择,当前);
if (pos 0) //binarySearch (-(插入点)- 1)
pos=(-pos)-1;
否则{
System.err.print(不允许相等元素);
系统。退出(-1);//不允许相等的元素
}
如果(pos==0 ) {//这意味着当前元素小于任何在选择,我们就不需要考虑这个元素
删除(0);
继续;
}
否则{
int insert _ pos=pos-1;
remains.set(0,选择。get(insert _ pos));
选择。set(insert _ pos,cur);
系统。出去。print( an select-);
打印(选择);
返回真实的
}
}
返回错误的
}
void selectAll() {
while (selectNext())
;
}
静态空的打印(数组列表整数列表){
int sum=0;
for(int I=0;我列出。size();i ) {
总和=列表。get(I);
系统。出去。打印(列表。get(I));
}
系统。出去。println( sum: sum );
}
公共静态void main(String[] args) {
NextWeighSum m=new NextWeighSum();
m。init();
m。select all();
}
}
这个算法打算在货郎问题 中使用,货郎问题是选择权值和最小的边集合,试探是否其构成路径。构成则问题解决,否则试探下一个。