下記のプログラムは、

  • sum円の所持金があり、n種類の商品の中からcnt個の商品を選びお釣り(min円)を最小にする

というアルゴリズムです(商品は安い順にx[1]円,x[2]円,,,,x[n]円と示されます)

現状では、下記のコードのとおり、回文の中に回文といった構造になっており、cntの値によってループの数やループの条件が変わっていくようになっております。

cntの値は入力値で与えられるため、どのcntの値にも対応可能な式を作りたいのですが、どのようにすればいいのでしょうか?

// cnt=2の場合
int min=10000001;
for(int k=n;sum>=x[k]&&k>=cnt;k--){
    for(int j=k-1;sum>=x[k]+x[j]&&j>=cnt-1;j--){
        min=min>(sum-x[k]-x[j])?(sum-x[k]-x[j]):min;
    }
}

// cnt=4の場合
int min=10000001;
for(int k=n;sum>=x[k]&&k>=cnt;k--){
       for(int j=k-1;sum>=x[k]+x[j]&&j>=cnt-1;j--){
           for(int i=j-1;sum>=x[k]+x[j]+x[i]&&i>=cnt-2;i--){
               for(int l=i-1;sum>=x[k]+x[j]+x[i]+x[l]&&l>=cnt-3;l--){
                       min=min>(sum-x[k]-x[j]-x[i]-x[l])?(sum-x[k]-x[j]-x[i]-x[l]):min;
               }
           }
       }
   }

✳︎初心者であるため、適切でない表現が含まれていますがご了承ください