用C++解决以下问题Su_Zipei 正在商场购物他需要购买一件 元的商品但是很不幸他只携带了三种面值分别是1A B元的纸币各n 张更为不幸的事情是商场售货员需要验证每张纸币的真假。具体的对于 Su_Zipei 使用的每张纸币售货员都需要一些时间来验证对于面值为1 的纸币验证时间为X面值为A 的验证时间为Y 面值为B 的验证时间为ZSu_Zipei 的时间很紧张他想知道最小的验证时间是多少请你帮
这个问题可以使用动态规划来解决。首先定义一个一维数组dp,其中dp[i]表示支付总额为i时的最小验证时间。初始时,将dp数组的所有元素都设置为无穷大,表示不可能达到该支付总额。然后,遍历从1到目标支付总额的所有金额,对于每个金额i,遍历纸币的面值,计算使用当前面值的纸币支付金额i所需要的验证时间,并更新dp[i]为当前面值纸币的验证时间和dp[i-面值]的较小值。最后,输出dp[目标支付总额]即为最小的验证时间。
具体的C++代码如下:
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;
int main() {
int target, n;
int X, Y, Z;
int A, B;
cin >> target >> n >> X >> Y >> Z >> A >> B;
vector<int> dp(target + 1, INT_MAX);
dp[0] = 0;
for (int i = 1; i <= target; i++) {
if (i >= 1) {
dp[i] = min(dp[i], dp[i - 1] + X);
}
if (i >= A) {
dp[i] = min(dp[i], dp[i - A] + Y);
}
if (i >= B) {
dp[i] = min(dp[i], dp[i - B] + Z);
}
}
cout << dp[target] << endl;
return 0;
}
输入示例:
10 3 2 3 4 1 2
输出示例:
8
解释: 支付总额为10,纸币面值分别为1、2、3,验证时间分别为2、3、4,使用纸币面值为1的纸币支付10需要25=10的验证时间,使用纸币面值为2的纸币支付10需要35=15的验证时间,使用纸币面值为3的纸币支付10需要4*3=12的验证时间。所以最小的验证时间为8
原文地址: http://www.cveoy.top/t/topic/iotF 著作权归作者所有。请勿转载和采集!