現実世界でどうやるかを考えると,
- 財布から1枚取り出して手元に加える
- 手元の総額が1000円を超えている場合,総額が1000円を下回らない範囲で,手元の小銭のうち最も額が安いやつから順に捨てる
と手続きを,財布が空になるまで繰り返すだろうと思う.
↓
という話を素直に実装した(もちろん効率はひどく悪い):
C++
1int main(int argc, char *argv[])
2{
3 const int Input[] = {
4 73, 100, 12, 5, 120, 46, 93, 7, 1, 133, 250, 101, 4, 49, 33, 478, 6, 106,
5 -1 //This value(<=0) is to indicate the end of input
6 };
7
8 int n = 0;
9 int Sum = 0;
10 int Buff[100];
11 {
12 const int *pInput = Input;
13 while( *pInput > 0 )
14 {
15 Buff[n++] = *pInput;
16 Sum += *pInput;
17
18 while( Sum > 1000 )
19 {
20 int *pMin = Buff;
21 for( int i=1; i<n; ++i )
22 {
23 if( Buff[i] < *pMin ){ pMin = Buff+i; }
24 }
25
26 if( Sum - *pMin > 1000 )
27 {
28 Sum -= *pMin;
29 *pMin = Buff[--n];
30 }
31 else
32 { break; }
33 }
34
35 ++pInput;
36 }
37 }
38
39 //Result
40 for( int i=0; i<n; ++i ){ printf( "%d\n", Buff[i] ); }
41 printf( "n=%d, Sum=%d\n", n, Sum );
42
43 return 0;
44}