面值 1,2,3 的硬币无限供给,兑换金额 N(N<32768),求方案数(模 20123 不需要,原题直接输出)。
#include#include #define MAX 35000 int dp[MAX]; int main() { int n; while (scanf("%d", &n) != EOF) { memset(dp, 0, sizeof(int)*(n+10)); dp[0] = 1; for (int c = 1; c <= 3; ++c) for (int j = c; j <= n; ++j) dp[j] += dp[j-c]; printf("%d\n", dp[n]); } return 0; }
枚举 3 元硬币个数 i = 0..N/3,剩余金额用 1,2 兑换,方案数为 (N-3i)/2 + 1。
总和:Σ_{i=0}^{N/3} (⌊(N-3i)/2⌋ + 1)
int main() {
int n;
while (scanf("%d", &n) != EOF) {
int t = n/3 + 1, sum = 0;
for (int i = 0; i < t; ++i)
sum += (n - 3*i)/2 + 1;
printf("%d\n", sum);
}
return 0;
}
N-3i 用 1,2 兑换:2 元硬币可取 0..⌊(N-3i)/2⌋,共 ⌊(N-3i)/2⌋+1 种