素朴なアプローチのように見えます。 C [i]はコイン値を表し、W [i]はコイン重量を表し、Nはコイン数を表します。
再帰部分は次のようになります。
long sum = 0;
for (int i = 0; i < N; ++i)
if (C[i] <= x)
sum += W[i] + total_change_weight(x-C[i]);
サンプルプログラムを入力、出力およびC/Wの初期化せずに、次のとおりです。
#define N 10
#define MAX_VALUE 101
long C[N];
long W[N];
long totals[MAX_VALUE];
long total_change_weight(long x)
{
if (x == 0)
return 0;
if (totals[x] >= 0)
return totals[x];
long sum = 0;
for (int i = 0; i < N; ++i)
if (C[i] <= x)
sum += W[i] + total_change_weight(x-C[i]);
totals[x] = sum;
return sum;
}
void main()
{
long value = 100;
//initialize C
...
//initialize W
...
//initialize totals
for (long i = 0; i < MAX_VALUE; ++i)
totals[i] = -1;
long result = total_change_weight(value);
}
それは明らか、どのように重みが考慮されていませんか? – MBo