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 << " ";
		}
	}
}