詰め合わせる内容でコストが変動してしまうとナップザック問題が成立しないので、セットメニューやトッピング追加した時の複数のメニューを組み合わせると値段が下がる場合は新しいメニューとして追加すればいいのではないのでしょうか。とりあえず全ての値段リストを作成してしまうという考え方です。
MENUMAX=xx ' 単品で注文した場合のメニューの総数
N=xx ' 組み合わせでどれだけできるか分からないのでたくさん
MENUCOST[MENUMAX,2] 'メニューのカロリーと単品の値段
MENULIST[N,1+3] '0に値引き結果の値段を入れる。3は組み合わせの上限,
まずはジョナサ…レストランJのメニューのカロリーと値段をDATAに記述してMENUCOSTに読み込みます。
次にMENULISTに単品で頼んだ時の値段としてMENUCOSTの値段とメニュー番号を格納します。
[300、0,-1,-1] ’[値段,メニュー番号、なし、なし]を表現
[350、1,-1,-1]
[280、2,-1,-1]
・・
[700,29,-1,-1] '例えば30種類の単品メニューだった場合
次にメニューを複数組み合わせたときに値引きが発生する条件を判定する関数を作ってMENUCOST同士の組み合わせを総当たりします。
値引き判定関数を通して単品同士よりも値段が安くなる組み合わせだった場合はMENULISTの下に新しく追加します。その際にペアを記入していきます。
0番と15番を組み合わせたら値引きが発生した場合
[300, 28,-1,-1]
[700, 29,-1,-1] 'ここまで単品メニューの値段リスト
[480, 0,15,-1] '←ここから値引きリストを追加(0と15番はセット値段で安くなった
…
値段が変動する組み合わせを新しくMENULISTにどんどん追加していきます。
カロリーはMENULISTの番号からMENUCOSTを参照して総カロリー数を算出する関数を作ります。
MENULISTを参照すれば値引き後の値段が分かる状態を作ってからナップザック問題を解けばいいのかなと思って書いてみました。
トッピングをいくつも追加できるとMENULISTが増えすぎてしまうのでまあ一種類だけとかに限定してみれば総当たりの爆発は起きないのでは。