今のままでは重複ありで、出力結果が
品物 1,1,1,1,1,1,
価格 366
となってしまいます。
これを重複なし、つまり品物が被らないようにしたいのですが、どのように書き加えればいいのでしょうか?
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
#define limit 121 // ナップサックの重量制限値
#define n 10 // 品物の種類
struct body
{
string name; // 品名
int size; // 重さ
int price; // 価格
};
int main(void)
{
// データの格納
struct body a[10];
a[0].name="1"; a[0].size=20; a[0].price=61;
a[1].name="2"; a[1].size=31; a[1].price=89;
a[2].name="3"; a[2].size=15; a[2].price=32;
a[3].name="4"; a[3].size=41; a[3].price=47;
a[4].name="5"; a[4].size=16; a[4].price=18;
a[5].name="6"; a[5].size=39; a[5].price=42;
a[6].name="7"; a[6].size=13; a[6].price=12;
a[7].name="8"; a[7].size=68; a[7].price=45;
a[8].name="9"; a[8].size=15; a[8].price=5;
a[9].name="10"; a[9].size=10; a[9].price=2;
int value[limit+1];
string item[limit+1];
for (int s=0; s<=limit; s++)
{
value[s]=0; // 初期値
}
for (int i=0; i<n; i++) // 品物の番号
{
for (int s=a[i].size; s<=limit; s++) // ナップのサイズ
{
int p=s-a[i].size; // 空きサイズ
int newvalue=value[p]+a[i].price;
if (newvalue>value[s])
{
// 最適解の更新
value[s]=newvalue;
item[s]=item[p]+a[i].name+",";
}
}
}
// 表示
cout << "品物\t" << item[limit] << endl;
cout << "価格\t" << value[limit] << endl;
}