Re: C++ help
roy axenov wrote:
On Mar 4, 2:36 pm, "untitled" <awsra...@gmail.com> wrote:
On Mar 4, 5:35 am, davy....@brentwood.bc.ca wrote:
On Mar 3, 9:39 pm, "untitled" <awsra...@gmail.com>
wrote:
int sevens=x/7
remainder=x - (sevens*7)
int twos= remainder/2
if (remainder - (twos*2)) =1 then twos++
if sevens != 0 && sevens<twos then twos=twos-sevens,
nines= sevens, sevens=0
if twos != 0 && twos<sevens then sevens=sevens-twos,
nines= twos, twos =0
i'll write the code in few minutes.
Unless I'm much mistaken, this doesn't work. Try 81. The
correct answer is 9x9, while your algorithm would suggest
9x7, 2x9.
Here's what seems to be a general solution (the only
problem with it is that its efficiency borders on that of
bogosort):
#include <iostream>
#include <stack>
#include <map>
const int stamp_1 = 2 ;
const int stamp_2 = 7 ;
const int stamp_3 = 9 ;
namespace xyz
{ int f ( std :: map < int , int > x )
{ int result = 0 ;
for
( std :: map < int , int > :: iterator i =
x . begin ( ) ;
i != x . end ( ) ; ++ i )
result += ( * i ) . second ;
return result ; }
int g ( std :: map < int , int > x )
{ int result = 0 ;
for
( std :: map < int , int > :: iterator i =
x . begin ( ) ;
i != x . end ( ) ; ++ i )
result += ( * i ) . first * ( * i ) . second ;
return result ; }
std :: map < int , int > solve
( int s , std :: stack < int > c )
{ std :: map < int , int > result ;
int best = 0 ;
if ( c . size ( ) )
{ result [ 0 ] = 1 ;
int cur_c = c . top ( ) ;
c . pop ( ) ;
int max_c = s / cur_c ;
std :: map < int , int > tmp ;
for ( int i = 0 ; i <= max_c ; ++ i )
{ tmp = solve ( s - cur_c * i , c ) ;
if ( tmp [ 0 ] ) continue ;
tmp [ cur_c ] = i ;
if ( g ( tmp ) != s ) continue ;
int cur_val = f ( tmp ) ;
if ( ! best || cur_val < best )
{ result = tmp ; best = cur_val ; } } }
return result ; } } ;
int main ( )
{ int sum ;
std :: cin >> sum ;
std :: stack < int > stamps ;
stamps . push ( stamp_1 ) ;
stamps . push ( stamp_2 ) ;
stamps . push ( stamp_3 ) ;
std :: map < int , int > solution =
xyz :: solve ( sum , stamps ) ;
for
( std :: map < int , int > :: iterator i =
solution . begin ( ) ;
i != solution . end ( ) ; ++ i )
std :: cout << ( * i ) . first << " " <<
( * i ) . second << std :: endl ; }
Nice, the first correct solution I have seen in this thread. But it really
gets a little slow on larger numbers. Also, it does not give all solutions.
Try producing this output:
news_group> time a.out 10000 10040
10000 = 1108 x 9c + 4 x 7c + 0 x 2c
10001 = 1111 x 9c + 0 x 7c + 1 x 2c
10002 = 1109 x 9c + 3 x 7c + 0 x 2c
10003 = 1106 x 9c + 7 x 7c + 0 x 2c = 1111 x 9c + 0 x 7c + 2 x 2c
10004 = 1110 x 9c + 2 x 7c + 0 x 2c
10005 = 1107 x 9c + 6 x 7c + 0 x 2c
10006 = 1111 x 9c + 1 x 7c + 0 x 2c
10007 = 1108 x 9c + 5 x 7c + 0 x 2c
10008 = 1112 x 9c + 0 x 7c + 0 x 2c
10009 = 1109 x 9c + 4 x 7c + 0 x 2c
10010 = 1112 x 9c + 0 x 7c + 1 x 2c
10011 = 1110 x 9c + 3 x 7c + 0 x 2c
10012 = 1107 x 9c + 7 x 7c + 0 x 2c = 1112 x 9c + 0 x 7c + 2 x 2c
10013 = 1111 x 9c + 2 x 7c + 0 x 2c
10014 = 1108 x 9c + 6 x 7c + 0 x 2c
10015 = 1112 x 9c + 1 x 7c + 0 x 2c
10016 = 1109 x 9c + 5 x 7c + 0 x 2c
10017 = 1113 x 9c + 0 x 7c + 0 x 2c
10018 = 1110 x 9c + 4 x 7c + 0 x 2c
10019 = 1113 x 9c + 0 x 7c + 1 x 2c
10020 = 1111 x 9c + 3 x 7c + 0 x 2c
10021 = 1108 x 9c + 7 x 7c + 0 x 2c = 1113 x 9c + 0 x 7c + 2 x 2c
10022 = 1112 x 9c + 2 x 7c + 0 x 2c
10023 = 1109 x 9c + 6 x 7c + 0 x 2c
10024 = 1113 x 9c + 1 x 7c + 0 x 2c
10025 = 1110 x 9c + 5 x 7c + 0 x 2c
10026 = 1114 x 9c + 0 x 7c + 0 x 2c
10027 = 1111 x 9c + 4 x 7c + 0 x 2c
10028 = 1114 x 9c + 0 x 7c + 1 x 2c
10029 = 1112 x 9c + 3 x 7c + 0 x 2c
10030 = 1109 x 9c + 7 x 7c + 0 x 2c = 1114 x 9c + 0 x 7c + 2 x 2c
10031 = 1113 x 9c + 2 x 7c + 0 x 2c
10032 = 1110 x 9c + 6 x 7c + 0 x 2c
10033 = 1114 x 9c + 1 x 7c + 0 x 2c
10034 = 1111 x 9c + 5 x 7c + 0 x 2c
10035 = 1115 x 9c + 0 x 7c + 0 x 2c
10036 = 1112 x 9c + 4 x 7c + 0 x 2c
10037 = 1115 x 9c + 0 x 7c + 1 x 2c
10038 = 1113 x 9c + 3 x 7c + 0 x 2c
10039 = 1110 x 9c + 7 x 7c + 0 x 2c = 1115 x 9c + 0 x 7c + 2 x 2c
real 0m0.011s
user 0m0.008s
sys 0m0.004s
Best
Kai-Uwe Bux