PS: 经典的多重背包,深刻理解01背包对此题目很有帮助,特别是“当且仅当”。这几个字。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cstdlib> using namespace std; const int maxm = 105; const int maxn = 100010; //Accepted 2844 453MS 692K 1048 B G++ Achiberx int p[maxm], num[maxm]; // price and number. int f[maxn]; int n, m, total; void OneZeroPack(int value) { for(int i = m; i >= value; i--) { if(f[i]==0 && f[i-value]!=0) { total++; f[i] = 1; } } } int main() { while(scanf("%d%d", &n, &m)!=EOF && (n||m)) { for(int i = 1; i <= n; i++) { scanf("%d", p+i); } for(int i = 1; i <= n; i++) { scanf("%d", num+i); } memset(f, 0, sizeof(f)); f[0] = 1; total = 0; for(int i = 1; i <= n; i++) { int k = 1; while(k < num[i]) { OneZeroPack(k*p[i]); num[i] -= k; k *= 2; } OneZeroPack(num[i]*p[i]); } printf("%d\n", total); } return 0; }
原文:http://blog.csdn.net/achiberx/article/details/23602541