题目的意思是,输入n个硬币的面值和数量,求不超过m的组合方法的数目。
今天学习了多重背包,但是还是不是很懂,继续努力。
下面的是AC的代码:
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; class data { public: int value, count; }; data Da[101]; int dp[100005]; int sum[100005]; int m, n; int main() { int i, j; while(scanf("%d%d", &n, &m) != EOF && m + n != 0) { for(i = 0; i < n; i++) { scanf("%d", &Da[i].value); } for(i = 0; i < n; i++) { scanf("%d", &Da[i].count); } memset(dp, 0, sizeof(dp)); dp[0] = 1; int ans = 0; for(i = 0; i < n ; i++) { memset(sum, 0, sizeof(sum)); for(j = Da[i].value; j <= m; j++) { if(!dp[j] && dp[j - Da[i].value] && sum[j - Da[i].value] < Da[i].count) { dp[j] = 1; sum[j] = sum[j - Da[i].value] + 1; ans++; } } } printf("%d\n", ans); } return 0; }
原文地址:http://blog.csdn.net/qq_25425023/article/details/45702933