ナップサックの容量を10としたとき、選択される品物が
1,XBOX360 1,XBOX360 となり、品物が重複してしまいます。
このように重複を起こさないように品物を選択したいのですが、どのように変更すればよいでしょうか?
ご指導お願いします。
#include <stdio.h>
#include <memory.h>
// 適当にナップサックに入れる商品リストを定義する
struct Goods
{
int no;
char name[80];
int weight; //各要素の重量
int price; //価値を最大にしたい
}goods[] = {
{0 ,"Wii" ,4 , 4500},
{1 ,"XBOX360" ,5 , 6100},
{2 ,"PSP" ,2 , 2100},
{3 ,"DS" ,1 , 1000},
{4 ,"PS3" ,6 , 5050},
{5 ,"gamecube" ,3 , 3000},
};
void main()
{
const int KNAP_SIZE_MAX = 8; // ナップサックに入る最大重量
int item[KNAP_SIZE_MAX+1] = {0};
int value[KNAP_SIZE_MAX+1] = {0};
for( int j=0; j<sizeof(goods)/sizeof(Goods); j++ ){ // 商品分のループ
for( int i=1; i<=KNAP_SIZE_MAX; i++ ){ // ナップサックサイズのループ
int knapSpace = i - goods[j].weight;
if( knapSpace >=0 && knapSpace <= KNAP_SIZE_MAX ){
int newValue = value[knapSpace] + goods[j].price;
if( newValue > value[i] ){
value[i] = newValue;
item[i] = goods[j].no;
}
}
}
}
// 結果表示
for( int i=1; i <= KNAP_SIZE_MAX; i++ ){
printf( "%4d,", value[i] );
}
printf("\n");
for( int i=1; i <= KNAP_SIZE_MAX; i++ ){
printf( "%4d,", item[i] );
}
printf("\n");
printf("ナップサックに入れるもの\n");
int count = 0;
int inItem[KNAP_SIZE_MAX]; // ナップサックに入れる最適な商品
memset( inItem, -1, sizeof(inItem) );
int nokori = KNAP_SIZE_MAX; // ナップサックの残りサイズ
do{
int inItem_ = nokori;
nokori = nokori - goods[ item[nokori] ].weight;
inItem[count++] = item[inItem_];
}while( nokori != 0 );
for( int i=0; i < KNAP_SIZE_MAX; i++ ){
if( inItem[i] > -1 ){
printf( "%d:%s, ", inItem[i], goods[ inItem[i] ].name );
}
}
printf("\n");
}