【发布时间】:2018-05-14 14:00:11
【问题描述】:
我正在尝试解决以下动态规划问题:给定无限数量的硬币(25)、硬币(10)、镍币(5)和便士(1),编写代码来计算表示 n 的方式数美分。
这是我的代码:
int coins(int n,unordered_map<int,int>& memo){
if (n < 0){
return 0;
}
else if (n == 1){
return 1;
}
else if (n == 5){
return 2;
}
unordered_map<int, int>::iterator iter = memo.find(n);
int coinsValue;
if (iter == memo.end()){
coinsValue = coins(n - 1,memo) + coins(n - 5,memo) + coins(n - 10,memo) + coins(n - 25,memo);
memo.insert(n, coinsValue);
}
return iter->second;
}
int coins(int n){
unordered_map<int, int> memo;
return coins(n, memo);
}
int main(){
cout << coins(10) << endl;
return 0;
}
我收到以下错误:
error C2100:illegal indirection
但我找不到导致问题的原因,代码看起来很干净。
【问题讨论】:
-
您能否向我们展示整个错误消息,而不仅仅是“非法间接”?
-
此外,您必须提取minimal reproducible example。没有它,您的问题将被视为题外话。
-
memo.insert(n, coinsValue);应该是memo.emplace(n, coinsValue);std::unordered_map::insert期望单个value_type是std::pair<const Key, T>。 -
而
iter在if之后仍然是end(),导致无效的取消引用。 -
代码试图解决什么问题?
标签: c++ stl dynamic-programming