【正经题解】砝码称重
2024-02-21 17:57:55
发布于:浙江
15阅读
0回复
0点赞
这道题的解题思路是使用动态规划。我们定义一个一维数组 ,其中 [ ] 表示能否用这些砝码称出重量 。
初始时,我们假设可以用一个砝码称出重量为 ,即 [ ] 。然后,对于每一种砝码,我们遍历其个数,更新 数组。具体而言,对于每个砝码,我们将其放入称重的过程中,逐步更新可以称出的不同重量的状态。
这里采用了三重循环:
外层循环遍历每一种砝码。
中层循环遍历当前砝码的个数。
内层循环倒序遍历 数组,逐步更新能够称出的不同重量。
最终,统计 数组中值为 的元素的个数,即为能够用这些砝码称出的不同重量的个数。
#include<bits/stdc++.h>
using namespace std;
int a[7], b[7] = {0, 1, 2, 3, 5, 10, 20};
bool dp[1001];
int main() {
// 输入各种砝码的个数
for (int i = 1; i <= 6; i++)
cin >> a[i];
// 初始化动态规划数组,表示可以用一个砝码称出重量0
dp[0] = 1;
// 对于每种砝码,进行状态转移更新dp数组
for (int i = 1; i <= 6; i++) {
for (int j = 1; j <= a[i]; j++) {
for (int k = 1000; k >= 0; k--) {
dp[k + b[i]] |= dp[k];
}
}
}
// 统计可以称出的不同重量的个数
int cnt = 0;
for (int i = 1; i <= 1000; i++) {
if (dp[i]) cnt++;
}
// 输出结果
printf("Total=%d", cnt);
return 0;
}
这里空空如也
有帮助,赞一个