c++ 砝码秤重 砝码秤重

Description

设有n种砝码,第k种砝码有Ck个,每个重量均为Wk,求:用这些砝码能秤出的不同重量的个数,但不包括一个砝码也不用的情况。

Input

输入的第一行只有一个数n,表示不同的砝码的种类数. 第2行至第n+1行,每行有两个整数.第k+1行的两个数分别表示第k种砝码的个数和重量.

Output

输出中只有一行数据:Total=N。表示用这些砝码能秤出的不同重量数。

Sample Input

2 
2 2
2 3

Sample Output

Total=8

HINT

对于100%的数据,砝码的种类n满足:1≤n≤100;

对于30%的数据,砝码的总数量C满足:1≤C≤20;

对于100%的数据,砝码的总数量C满足:1≤C≤100;

对于所有的数据,砝码的总重量W满足:1≤W≤400000;

Source

#include <bits/stdc++.h>
using namespace std;
bool f[400001];
int n, a[101], b[101];
int main() {
    cin >> n;
    int max = 0;
    for (int i = 1; i <= n; i ++) {
        scanf("%d %d", &a[i], &b[i]);
        max = a[i] * b[i];
    }
    memset (f, 0, sizeof(f));
    f[0] = 1;
    for (int i = 1; i <= n; i ++) {
        for (int j = 1; j <= a[i]; j ++) {
            for (int k = 400000; k >= 0; k --) {
                if (f[k] == 1 && k + b[i] <= 400000) {
                    f[k + b[i]] = 1;
                }
            }
        }
    }
    int ans = 0;
    for (int i = 1; i <= 400000; i ++) {
        if (f[i] == 1) {
            ans ++;
        }
    }
    printf("Total=%d", ans);
    return 0;
}
/**************************************************************
    Problem: 1604
    User: LJA001162
    Language: C++
    Result: 正确
    Time:84 ms
    Memory:1928 kb
****************************************************************/