描述 | |
---|---|
知识点 | 字符串,循环,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归 |
运行时间限制 | 10M |
内存限制 | 128 |
输入 | int n:n表示有多少组重量不同的砝码,1<=n<=10<><=n<=10<><=n<=10<><=n<=10<><=n<=10<><=n<=10<><=n<=10<><=n<=10<> int[] weight:表示n组砝码的重量,1<=mi<=10<><=mi<=10<><=mi<=10<><=mi<=10<><=mi<=10<><=mi<=10<><=mi<=10<><=mi<=10<> int[] num:表示n组砝码的最大数量,1<=xi<=10<><=xi<=10<><=xi<=10<><=xi<=10<><=xi<=10<><=xi<=10<><=xi<=10<><=xi<=10<> |
输出 | 利用给定的砝码可以称出的不同的重量数 |
样例输入 | 2 1 2 2 1 |
样例输出 | 5 |
源代码
- #include <iostream>
- #include <vector>
- using namespace std;
- int fama(int n, int weight[], int nums[]){
- //定义bool型标记数组,记录该重量是否存在
- //计算标记数组的最大可能的不同重量数,分配空间
- int maxWeight = 0;
- for (int i = 0; i < n; i++)
- maxWeight += weight[i] * nums[i];
- vector<bool> flag(maxWeight + 1, false);
- //标记数组的初始状态
- flag[0] = true;//没有砝码的情况,称重重量为0,也属于一种情况
- int total = 0;
- int count = 1;//没有砝码的情况,算一种
- //从第1组砝码开始添加
- int sum = 0;
- for (int i = 0; i < n; i++){//循环添加第i组砝码
- for (int j = 1; j <= nums[i]; j++){//第i组砝码,逐个添加
- for (int k = 0; k <= total; k++){
- if (flag[k]){
- sum = k + weight[i] * j;
- if (!flag[sum]){
- flag[sum] = true;
- count++;
- }
- }
- }
- }
- total = sum;
- }
- return count;
- }
- void main(){
- int n;
- cin >> n;
- int* weight = new int[n];
- int* nums = new int[n];
- for (int i = 0; i < n; i++)
- cin >> weight[i];
- for (int i = 0; i < n; i++)
- cin >> nums[i];
- cout << fama(n, weight, nums) << endl;
- delete[] weight;
- delete[] nums;
- }