OK, I read the RPN solution just before I went to bed. I then decided to see if I could do better. So I sat in bed with a 41CV and came up with this.
It finds the answer (or an answer) in under 5 minutes on a bog standard 41, and the code is far from optimal.
First there;s the setup program:
01 LBL "SETUP"
02 .12
03 STO 10 // Reg 10 starts the block of proportions
04 .24
05 STO 11
06 .35
07 STO 12
08 .47
09 STO 13
10 .59
11 STO 14
12 .82
13 STO 15
14 1.29
15 STO 16
16 1.41
17 STO 17
18 1.65
19 STO 18
20 2.12
21 STO 19
22 2.35
23 STO 20
24 3.17
25 STO 21
26 4
27 STO 22
28 10.22
29 STO 23
30 55.46
31 STO 24
32 LBL "S2" // OK, so I needed to test some things a few times :-)
33 10.024 // ISG value for data block
34 STO 02 // Reg 2 stores an initial ISG value for the data
35 RCL 10 // get the first value
36 .005
37 +
38 1/X
39 100
40 *
41 INT // this is the min value the solution could be
42 RCL 10
43 .005
44 -
45 1/X
46 100
47 *
48 INT
49 1
50 + // and this is the max
51 1 E3 // OK, synthetic line would have been better!
52 /
53 + // this is an ISG template for possible solutions
54 STO 04 // store the template in Reg 04
55 FIX 2 // we need to round to 2 devimal places
56 END
And this is the main program
01 LBL "CD?"
02 RCL 04 // get template for possible solutions
03 STO 03 // Store in in Reg 03
04 LBL 01 // Start of routine to check if current value is OK
05 RCL 02 // get template for data registers
06 STO 01 // Reg 01 is our counter
07 LBL 02 // Start of routine to check a data value
08 XEQ 40 // check if current guess works with current data
09 X<>Y? // test returns Y as data, X as calc value
10 GTO 04 // Failed! Need to find a working value
11 TONE 9 // signals match of data works with guess
12 ISG 01 // now try next data
13 GTO 02 // loop back to check it
14 R^ // place guess in X
15 BEEP // Ta-Daaaaa! it worked!!!
16 STOP // t-t-t-that's all folks
17 LBL 03 // look at that, a routine that I don't use any more.
18 TONE 0
19 ISG 03
20 GTO 01
21 LBL 05
22 BEEP // TOTAL Failure
23 CLX // Place 0 in X
24 STOP
25 LBL 04 // Just increment guess until current data works with it
26 TONE 0 // Tone for failure of a guess
27 ISG 03 // Increment guess
28 GTO 06 // continue the test
29 GTO 05 // run off the end, so this is a failure
30 LBL 06 // check this guess with failed data item
31 XEQ 40 // do the check
32 X=Y? // this one OK?
33 GTO 07 // Yep!!!!!
34 GTO 04 // NO, sorry. Neet to try next guess
35 LBL 07 // Guess is OK for this data
36 TONE 7 // minor success sound
37 GTO 01 // now go back and check ALL the data
38 LBL 40 // check guess against data
39 RCL 03
40 INT // this is the guess
41 VIEW X // Show the poor user something other than a goose
42 RCL IND 01 // get data item
43 RCL Y // get guess
44 RCL Y // get data
45 * // about how many CDs?
46 100
47 /
48 .5
49 +
50 INT // how many CDs?
51 R^ // Guess
52 / // calculated proportion
53 100
54 *
55 RND // calculated percentage to 2 dp
65 RTN
OK, the idea is that the setup program assumes that the first data value is the smallest, and this percentage represents 1 set of CDs. So it determines a range of possible solutions
The main program loops through the possible solutions (guesses). It checks each data value in turn to see if this guess fits the data. If it's ok for all of them, then you're there, and the program finishes. If any data item fails, then the program keeps incrementing the guess until this data value becomes valid, then it returns to checking ALL the data values.
As I said. All in under 5 minutes. Note also that should the 0.12% represent 2 or more sets, then the routine would fail, but it would not be too hard for the routine to be extended to cater for that possibility too.
OK, as I said, I was in bed when I wrote this. I was so excited that I jumped up and I'm typing this dressed only in my underwear (not a pretty sight). I thank god for my UPS which does a good job of keeping the room warm :-)
What was that joke about middle aged men using the internet in their underwear? (oooh, yuk!)
Like I said -- Too much information :-)