您的位置:首页 > 其它

【华为OJ】称砝码

2016-07-13 14:00 351 查看
描述
现有一组砝码,重量互不相等,分别为m1、m2……mn;他们可取的最大数量分别为x1、x2……xn。现在要用这些砝码去称物体的重量,问能称出多少中不同的重量。 注:
称重重量包括0要对输入数据进行校验 方法原型:public static int fama(int n, int[] weight, int[] nums)

知识点字符串,循环,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归
运行时间限制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
;  

    int* nums = new int
;  

    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;  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: