深入浅出学算法070-砝码称重
时间限制 : 1.000 sec 内存限制 : 128 MB
题目描述
设有1克、2克、3克和5克和10克、20克的砝码各若干枚(其总重≤1000),
输入
输入方式:a1 , a2 ,……, a6
(表示1g砝码有a1个,2g砝码有aa2个,…,20g砝码有a6个)
输出
输出方式:Total=N
(N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)
样例输入 Copy
1 1 0 0 0 0
样例输出 Copy
Total=3
深入浅出学算法070-砝码称重
时间限制 : 1.000 sec 内存限制 : 128 MB
题目描述
设有1克、2克、3克和5克和10克、20克的砝码各若干枚(其总重≤1000),
输入
输入方式:a1 , a2 ,……, a6
(表示1g砝码有a1个,2g砝码有aa2个,…,20g砝码有a6个)
输出
输出方式:Total=N
(N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)
样例输入 Copy
1 1 0 0 0 0
样例输出 Copy
Total=3
阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程
问题描述:有1克、2克、3克和5克和10克、20克的砝码各若干枚,总重≤1000克。输入方式:a1
解决方案:
可以使用动态规划解决这个问题。首先,我们可以将砝码的重量从小到大排序,然后遍历每个砝码,计算当前砝码的组合数目。对于每个砝码,我们可以使用一个数组来存储当前砝码的组合数目。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> weights = {1, 2, 3, 5, 10, 20};
vector<int> dp(1001, 0);
dp[0] = 1;
for (int i = 0; i < n; i++) {
for (int j = 1000; j >= weights[i]; j--) {
dp[j] += dp[j - weights[i]];
}
}
cout << dp[1000] << endl;
return 0;
}
在上面的代码中,我们首先读取输入的砝码数量,然后将砝码的重量从小到大排序。然后,我们使用一个数组dp来存储当前砝码的组合数目。对于每个砝码,我们遍历每个可能的重量,计算当前砝码的组合数目,并将其添加到dp数组中。最后,我们输出dp[1000],即总重≤1000克的砝码组合数目。