典型的背包,不多说。
#include <iostream> using namespace std; const int MAX_VALUE = 1000 * (1 + 2 + 5); int ans[MAX_VALUE + 1]; int main () { int coins[3],values[3] = {1,2,5}; while (scanf("%d%d%d",&coins[0],&coins[1],&coins[2]) != -1) { if (coins[0] == 0 && coins[1] == 0 && coins[2] == 0) break; memset(ans,0,sizeof(ans)); ans[0] = 1; int lowerBound,maxValue = 0; for (int i = 0;i < 3;i ++)/* 三种硬币 */ { for (int j = 0;j < coins[i];j ++)/* 第i种硬币有coins[i]枚 */ { if (j == 0) lowerBound = values[i]; else lowerBound = maxValue; for (int k = maxValue + values[i];k >= lowerBound;k --) { if (ans[k - values[i]] == 1) { ans[k] = 1; maxValue = maxValue > k ? maxValue : k; } } } } for (int i = 1; ;i ++) { if (ans[i] == 0) { printf("%d\n",i); break; } } } return 0; }