输入包括两行,第一行两个整数n(0<=n<=1000)代表数组长度和aim(0<=aim<=5000),第二行n个不重复的正整数,代表arr。
输出一个整数,表示组成aim的最小货币数,无解时输出-1.
3 20 5 2 3
4
20=5*4
3 0 5 2 3
0
2 2 3 5
-1
时间复杂度,空间复杂度
。
#include <stdio.h> #define MIN(X,Y) ((X) < (Y) ? (X) : (Y)) int main(void) { int n, aim; scanf("%d %d", &n, &aim); if (n == 0) printf("%d\n", -1); int arr[n]; for (int i = 0; i < n; i++) { scanf("%d", arr + i); } int tmp; int dp[aim + 1]; dp[0] = 0; for (int i = n - 1; i >= 0; i--) { for (int rest = 1; rest <= aim; rest++) { tmp = -1; if (rest - arr[i] >= 0 && dp[rest - arr[i]] != -1) { tmp = 1 + dp[rest - arr[i]]; } if (i != n-1 && dp[rest] != -1) { tmp = tmp == -1 ? dp[rest] : MIN(tmp, dp[rest]); } dp[rest] = tmp; } } printf("%d\n", dp[aim]); return 0; }