AOJ - Problem 0031 : Weight
入力aに対し、aを超えない最大の2nをaから引いていくとうまくいくと思います。
#include <iostream> #include <vector> using namespace std; int main(){ int w, g[10]; vector<int> ans; for(int i=0,j=1 ; j<=512 ; j*=2, i++){ g[i] = j; } while( cin >> w ){ ans.clear(); for(int i=9 ; i>=0 ; i--){ if( w <= 1 ){ if( w == 1 ) ans.push_back( w ); break; } else if( g[i] <= w ){ w -= g[i]; ans.push_back( g[i] ); } } for(int i=ans.size()-1 ; i>=0 ; i--){ cout << ans[i] ; (i==0)? cout << endl : cout << " "; } } }