这个题是比较难的贪心题吧。 主要算法: 1、先求出最小值,同时可以根据能否找到最小值来判断是否有解。 2、由最小值慢慢逼近求最大值 代码: /* ID: mnlm1991 PROG: hdoj 3348 LANG: C++ */ #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<vector> #include<algorithm> #include<string> #include<map> #include<set> #include<bitset> #include<queue> #include<iostream> using namespace std; int T; int a[5]; int b[5]; int P; int num[] = {1, 5, 10, 50, 100}; void Deal(int &x, int &y, int P) { int tmp = P; y = 0; int i; memset(b, 0, sizeof(b)); for (i = 4; i > 0; i--) { if (tmp / num[i] <= a[i]) { b[i] = tmp / num[i]; y += b[i]; tmp %= num[i]; } else { b[i] = a[i]; y += b[i]; tmp -= num[i] * a[i]; } } if (a[0] < tmp) { x = -1; y = -1; return; } else { b[0] = tmp; y += tmp; } x = 0; for (i = 0; i < 4; i++) { a[i + 1] += (a[i] - b[i]) * num[i] / num[i + 1]; } for (i = 4; i > 0; i--) { tmp = (a[i - 1] - b[i - 1]) * num[i - 1] / num[i]; if (b[i] <= tmp) { b[i - 1] += b[i] * num[i] / num[i - 1]; b[i] = 0; } else { b[i - 1] += tmp * num[i] / num[i - 1]; b[i] -= tmp; } x += b[i]; } x += b[i]; return; } int main() { while (scanf("%d", &T) != EOF) { while (T--) { scanf("%d", &P); int i; for (i = 0; i < 5; i++) { scanf("%d", &a[i]); } int x; int y; Deal(x, y, P); printf("%d %d/n", y, x); } } return 0; } /* 10 56 1 10 50 1 2 */