Tsinsen A1104 砝码称重

http://oj.tsinsen.com/A1104

背包九讲中的多重背包链接:http://love-oriented.com/pack/P03.html

分析:第一次见到多重背包,大致是说物品价值一定,重量一定,但有多份。注意为了正确性,三重循环的i-循环一定要按v[i]升序,k-循环一定要从sup递减至v[i],j-循环是份数

代码:

#include "bits/stdc++.h"
using namespace std;

const int v[6] = { 1, 2, 3, 5, 10, 20 };
int Can[1050] = { 1 }, cnt[6], sup, res;

int main() {
    for (int i = 0; i < 6; ++i) {
        scanf("%d", &cnt[i]);
        sup += cnt[i] * v[i];
    }
    for (int i = 0; i < 6; ++i)
        for (int j = 0; j < cnt[i]; ++j)
            for (int k = sup; k >= v[i]; --k)
                Can[k] |= Can[k - v[i]];
    for (int i = 1; i <= sup; ++i)
        res += Can[i];
    printf("Total=%d\n", res);
    return 0;
}

你可能感兴趣的:(ACM-01)