Project Euler 31

イギリスでは硬貨はポンド£とペンスpがあり,一般的に流通している硬貨は以下の8種類である.

1p, 2p, 5p, 10p, 20p, 50p, £1 (100p) and £2 (200p).

以下の方法で£2を作ることが可能である.

1×£1 + 1×50p + 2×20p + 1×5p + 1×2p + 3×1p

これらの硬貨を使って2ポンドを作る方法は何通りあるか?

Mathematica

A = Table[0, {i, 200}];

Do[
 For[j = i, j <= 200, j++,
  If[j == i,
   A[[j]] += 1,
   A[[j]] += A[[j - i]]
   ]
  ]
 , {i, {1, 2, 5, 10, 20, 50, 100, 200}}]

A[[200]]

漸化式的な考えです。
Aは200個の配列で、それぞれの配列番号ペンスを作る組み合わせは何通りあるか、を示しています。
Aの100番目には100ペンスになる組み合わせが入っています。

C/C++

#include <iostream>
using namespace std;

int is200(int p1,int p2,int p5,int p10,int p20,int p50,int p100,int p200){
	int p;
	p = p1*1 + p2*2 + p5*5 + p10*10 + p20*20 + p50*50 + p100*100 + p200*200;
	if(p>200) return 1;
	else if(p<200) return -1;
	else return 0;
}

int main(){
	int count=0;
	int p1, p2, p5, p10, p20, p50, p100, p200;

	for(p200=0 ; p200<=1 ; p200++){
		if(is200(0,0,0,0,0,0,0,p200)==1) break;
		for(p100=0 ; p100<=2 ; p100++){
			if(is200(0,0,0,0,0,0,p100,p200)==1) break;
			for(p50=0 ; p50<=4 ; p50++){
				if(is200(0,0,0,0,0,p50,p100,p200)==1) break;
				for(p20=0 ; p20<=10 ; p20++){
					if(is200(0,0,0,0,p20,p50,p100,p200)==1) break;
					for(p10=0 ; p10<=20 ; p10++){
						if(is200(0,0,0,p10,p20,p50,p100,p200)==1) break;
						for(p5=0 ; p5<=40 ; p5++){
							if(is200(0,0,p5,p10,p20,p50,p100,p200)==1) break;
							for(p2=0 ; p2<=100 ; p2++){
								if(is200(0,p2,p5,p10,p20,p50,p100,p200)==1) break;
								for(p1=0 ; p1<=200 ; p1++){
									if(is200(p1,p2,p5,p10,p20,p50,p100,p200)==0) count++;
								}
							}
						}
					}
				}
			}
		}
	}

	cout << count << endl;

	int end;
	cin >> end;
}

ザ・愚直。