に私が提供された例に使用されていますResource
クラスを含め、あなたのためにこの簡単な方法を書いています。
private static class Resource {
private double value;
private int available;
public Resource(double value, int available) {
this.value = value;
this.available = available;
}
public void setValue(double value) {
this.value = value;
}
public double getValue() {
return this.value;
}
public void setAvailable(int available) {
this.available = available;
}
public int getAvailable() {
return this.available;
}
}
画面上の数字を印字方法
public static void findNumbers(Resource[] availableResources, double targetNumber) {
// Keeps Track of which resource is currently in use.
int resourceInCheck = 0;
// Remainder of the wanted number
double remainder = targetNumber;
System.out.print("Values: ");
while(remainder > 0) {
if(remainder >= availableResources[resourceInCheck].getValue() && availableResources[resourceInCheck].getAvailable() > 0) {
System.out.print(availableResources[resourceInCheck].getValue() + ", ");
remainder -= availableResources[resourceInCheck].getValue();
availableResources[resourceInCheck].setAvailable((availableResources[resourceInCheck].getAvailable() - 1));
}
else {
resourceInCheck++;
}
}
}
メインメソッド
public static void main(String[] args){
Resource firstResource = new Resource(5, 5);
Resource secondResource = new Resource(1, 8);
Resource thirdResource = new Resource(0.5, 7);
Resource[] availableResources = {firstResource, secondResource, thirdResource};
findNumbers(availableResources, 17.5);
}
出力
Values: 5.0, 5.0, 5.0, 1.0, 1.0, 0.5,
はやはり、これはの特性に合わせて可能な解決策でありますこの問題、明らかにそれに取り組む他の方法があります。
注:targetNumber
は、利用可能なすべてのリソースの合計よりも小さいことが必要です。
注2:リソースの配列は、大きい値から小さい値にソートする必要があります。
あなたの質問は正確には何ですか? *すべての*または*のベスト*の組み合わせを取得しますか? –
「ベスト」の組み合わせが必要な場合は、この問題の最善の手段を説明してください。 すべての組み合わせが単純な場合は、3つの入れ子になったループを入れます。 – JackDaniels
サブセット和問題を使用して簡単に解くことができます。 –