找到最小数量的硬币,使一个给定的价值,我试图解决这个浮动硬币值,而不是整数硬币值在 rust

sg3maiej  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(145)

问题陈述:编写一个函数,该函数返回使用给定的硬币面额对目标金额进行找零所需的最小硬币数。
我试图将下面的 i32integer-basedsolution转换为基于floatf32f64 的解决方案,以便它可以接受十进制输入,如硬币面额0.5、1.5、2.0等。

use std::cmp;

fn min_number_of_change(n: i32, denoms: Vec<u32>) -> i32 {
    let mut ways: Vec<i32> = vec![i32::MAX;n as usize + 1];
    ways[0] = 0;

    for denom in denoms.iter() {
        for current in 0..ways.len() {
            if *denom <= current as u32 {
                ways[current as usize] = cmp::min(ways[current as usize], 1 + ways[current as usize - *denom as usize]) 
                                  
            }
        }
    }
    if ways[n as usize] != i32::MAX {
        ways[n as usize]
    } else {
          -1
    }
}
fn main() {
    let denoms: Vec<u32> = vec![1, 5, 10, 2, 3];
    let n: i32 = 6;

    let result: i32 = min_number_of_change(n, denoms);
    println!("Result: {}", result);
}

Play Ground for above code
我很天真地尝试用f32和min函数替换i32来进行浮点数比较。运行时,编译器抱怨类型不匹配,无法从usize中减去f32,类型[f32]无法被f32索引。我想我遗漏了一些非常基本的要点。

fn min_number_of_change(n: f32, denoms: Vec<f32>) -> f32 {
    let mut ways: Vec<f32> = vec![f32::INFINITY; n + 1.0];
    ways[0] = 0.0;

    for denom in denoms.iter() {
        for current in 0..ways.len() {
            if *denom <= current {
                ways[current] = (ways[current].min(1 + ways[current  - *denom ]), 1 + ways[current  - *denom ])
            }
        }
    }
    if ways[n] != f32::INFINITY {
        ways[n]
    } else {
        -1.0
    }
}

fn main() {
    let denoms: Vec<f32> = vec![2.00, 1.00, 0.50, 0.20, 0.10, 0.05, 0.02, 0.01];
    let n: f32 = 4.55;

    let result: f32 = min_number_of_change(n, denoms);
    println!("Result: {}", result);
}

Playground for above code

u5i3ibmn

u5i3ibmn1#

第一个错误很容易修复,你可以写current as f32 - *denom来代替current - *denom
但是这就给我们留下了第二个错误,这个错误更难。你不能用f32来索引Vec,因为这需要访问第0.5个元素,这个元素距离第一个元素半个元素宽度。这是不可能的。
你最好的选择可能是使用整数,并将它们视为固定点值,即1意味着0.01在你的货币等。

fn main() {
    let denoms = [2.00, 1.00, 0.50, 0.20, 0.10, 0.05, 0.02, 0.01].into_iter().map(|v| (v * 100.0) as i32).collect();
    let n = (4.55 * 100.0) as i32;
    let result = min_number_of_change(n, denoms) as f32 / 100.0;
    println!("Result: {}", result);
}

并使用min_number_of_change的整数版本

相关问题