称砝码

有一组砝码,重量互不相等,分别为 m1 m2 m3……mn ;它们可取的最大数量分别为 x1 x2 x3……xn  
现要用这些砝码去称物体的重量 , 问能称出多少种不同的重量。  
Input
测试数据第一行一个整数 n n<=10 ),表示有多种不同的砝码;  
第二行 n 个整数(中间用空格分隔), m1 m2 m3……mn ,分别表示 n 个砝码的重量;( 1<=mi<=20  
第三行 n 个整数(中间用空格分隔), x1 x2 x3……xn ,分别表示 n 个砝码可取的最大数量。( 1<=xi<=20  
Output
每组数据输出仅一行,一个整数,表示利用给定的砝码可以称出的不同的重量数。  
注:包括 0  
Sample Input
2

1 2

2 1

直接枚举 。计算量太大,感觉不可取,于是就用DP可以很好的解决了。

#include 
#include 
using namespace std;
int x[99],m[99],f[99999];

int main()
{
    int n,i,j,k,M=0;
    cin>>n;
    for(i=1;i<=n;i++)
        scanf("%d",&m[i]);
    for(i=1;i<=n;i++)
        scanf("%d",&x[i]);

    for(i=1;i<=n;i++)
        M+=m[i]*x[i];
    f[0]=1;
    for(i=1;i<=n;i++)
        for(j=M;j>=0;j--)
            for(k=1;k<=x[i];k++)
            {
                f[j]=f[j]|f[j-k*m[i]];
            }
    int num=0;
    for(i=0;i<=M;i++)
        if(f[i])num++;
    cout<


你可能感兴趣的:(华为OJ)