问题陈述:编写一个函数,该函数返回使用给定的硬币面额对目标金额进行找零所需的最小硬币数。
我试图将下面的 i32integer-based
solution转换为基于float
f32 或 f64 的解决方案,以便它可以接受十进制输入,如硬币面额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);
}
1条答案
按热度按时间u5i3ibmn1#
第一个错误很容易修复,你可以写
current as f32 - *denom
来代替current - *denom
。但是这就给我们留下了第二个错误,这个错误更难。你不能用
f32
来索引Vec
,因为这需要访问第0.5
个元素,这个元素距离第一个元素半个元素宽度。这是不可能的。你最好的选择可能是使用整数,并将它们视为固定点值,即
1
意味着0.01
在你的货币等。并使用
min_number_of_change
的整数版本