rust 组合算法
简述
组合:求一个m长的数列,n(n\<= m)个元素的所有组合。
代码
计算下一个组合序号
fn generate_next_index(length :usize,index:&mut Vec<usize>){
let index_length = index.len();
let mut p:usize = index_length-1;
loop {
if p < 1{
break;
}
if index[p] == length+p-index_length{
p -= 1;
}else{
break;
}
}
let mut num:usize;
num = index[p];
while p< index_length{
num +=1;
index[p] = num;
p+=1;
}
}
emmm
fn print_all_c(ls :&Vec<i64>,n usize){
let length = ls.len();
if n > length{
return
}
let mut index:Vec<usize> = (0..n as usize).collect();
let last_index = ls.len() - k as usize;
let mut start_index:usize = 0;
while start_index <= last_index{
index.iter().for_each(|&x| print!("{} ",ls[x]));
print!("\n")
generate_next_index(length,&mut index);
start_index = index[0];
}
}
求所有组合中的最大和
fn get_max_sum(ls:&Vec<i64>,n usize) -> i64{
let mut res:i64 = -1;
let length = ls.len();
if n > length{
return res;
}
let mut index:Vec<usize> = (0..n as usize).collect();
let last_index = ls.len() - k as usize;
let mut start_index:usize = 0;
let mut sum:i64;
while start_index <= last_index{
sum = index.iter().fold(0,|ass,&x| ass+ls[x]);
if sum > res{
res = sum;
}
generate_next_index(length,&mut index);
start_index = index[0];
}
}
ps: rust Iiterator 提供fold
方法,类似与python中的reduce
方法