题意:
有三种硬币面值分别为1 2 5, 给定每种硬币的数量,问用这些硬币不能组成的最小面值是多少
思路:
因为每个硬币有个数限制,但是也不难构造出
G(x)=(1+x+x^2+...+x^num1)(1+x^2+x^4+...+x^2*num2)(1+x^5+x^10+...+x^5*num5)
将多项式展开后, xi 项对应的系数就是组成面值为i的方案数 。#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 1e4; const int val[5] = {1, 2, 5}; int num[5]; int V, dp[2][maxn]; int main() { while (~scanf("%d%d%d",&num[0],&num[1],&num[2]) && (num[0]+num[1]+num[2])) { V = 0; for (int i = 0; i < 3; i++) V += num[i] * val[i]; memset(dp, 0, sizeof(dp)); for (int i = 0; i <= num[0]; i++) dp[0][i] = 1; for (int i = 1; i <= 2; i++) { int pre = (i-1)%2, cur = i%2; for (int j = 0; j <= V; j++) { if (!dp[pre][j]) continue; for (int k = 0; k <= num[i] * val[i]; k += val[i]) { if (j + k <= V) dp[cur][j+k] += dp[pre][j]; } } } int ans; for (ans = 0; ans <= V; ans++) { if (!dp[0][ans]) break; } printf("%d\n", ans); } return 0; }