完全列挙のプログラムで下記のコードで、探索の中で暫定解よりも価値が低い組合せが見込まれる場合は枝刈りを行い、それが見えるようにしたいのですが、今のままでは暫定解しか表示されません。
どのように書けばいいのでしょうか。コンパイラはGCCを使用しています。丸投げする形になってしまい申し訳ありません。どうかよろしくお願いします。
ソースコード
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
#include<stdio.h>
#include<stdlib.h>
#define KNAP_MAX 30
#define ITEM_NUM 10
#define N 50
int a[N]={0}, u[N + 1];
int weight[ITEM_NUM];
int value[ITEM_NUM];
int maxSelect[ITEM_NUM];
int maxValue = 0;
int totalWeight = 0;
int count;
FILE *fin;
void search(int itemNum, int sumWeight, int sumValue,int ch)
{
int k;
int select[ITEM_NUM];
if(sumWeight > KNAP_MAX)
{
return ;
}
if(itemNum < ITEM_NUM)
{
search(itemNum + 1, sumWeight, sumValue, ch);
a[ch]=itemNum+1;
search(itemNum + 1, sumWeight + weight[itemNum], sumValue + value[itemNum], ch+1);
a[ch]=0;
}
else
{
if(sumValue > maxValue)
{
maxValue = sumValue;
totalWeight = sumWeight;
for(k = 0; k < ITEM_NUM; k++)
printf("%d", a[k]);
printf("(%d円, %dkg)", sumValue, sumWeight);
printf("→暫定解更新(%d円, %dkg)\n", maxValue, totalWeight);
}
}
}
int main() {
if((fin=fopen("weight10.dat","r"))==NULL){
printf("weight10.dat can not open\n");
exit(1);
}
for(count=0;count<ITEM_NUM;count++)fscanf(fin,"%d\n",&weight[count]);
fclose(fin);
if((fin=fopen("value10.dat","r"))==NULL){
printf("value10.dat can not open\n");
exit(1);
}
for(count=0;count<ITEM_NUM;count++)fscanf(fin,"%d\n",&value[count]);
fclose(fin);
printf("< 列挙 >\n\n");
search(0, 0, 0, 0);
printf("\n< 全探索で得られた解 >\n");
printf("重量の合計値 = %dkg\n", totalWeight);
printf("価値の最大値 = %d円\n", maxValue);
return 0;
}
/*-----------------------------------------------------
value10.dat
1198
1011
814
764
816
994
1391
615
1398
924
weight10.dat
3
10
8
9
7
4
7
5
8
2
924
-----------------------------------------------------*/
No.2
- 回答日時:
普通の人は if を使うだろうけど (while でできるかなぁ...), そんなことを聞きたいんじゃない.
どのような条件で判定する? 「自分がやる」としたらどうする?
自分としてはナップサックの容量以下という条件の元で価値が大きくなった組み合わせを順次暫定解として保存、その後の探索で列挙の番号に応じて品物を足していく際に暫定解よりも価値が大きくならないようならその場で探索を止めて、別の組み合わせを調べるようにします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# C言語 3 2022/11/09 13:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
比較回数と交換回数表示について
-
nCmの関数
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 配列と関数の練習問題
-
c言語
-
std::set<int> で、ある値が何...
-
卒業研究でよく分からないとこ...
-
C言語 エラーの原因がわからな...
-
DLLをGetProcAddress()で実行で...
-
【C++】関数ポインタの使い方
-
read関数をノンブロッキングで...
-
C言語における対称行列の作り方...
-
構造体の勉強中です 合計点の高...
-
C言語です。
-
C言語での引数の省略方法
-
困ってます…nCrを求めるC言語...
-
C++でvectorにテキストファイル...
-
プログラミング
-
素数 再帰関数
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
「指定されたキャストは有効で...
-
C言語 配列と関数の練習問題
-
複数桁10進数の*桁目だけを抽出...
-
(int *)の意味
-
if と配列の組み合わせ
-
ラップ関数とはどんなものですか?
-
卒業研究でよく分からないとこ...
-
【C++】関数ポインタの使い方
-
c言語
-
足して100になるような乱数のア...
-
C言語初心者です、、、お助けく...
-
数字列を3桁ごとにカンマで区切...
-
C言語 エラーの原因がわからな...
-
実数の整数部,小数部の取得
-
課題でつまってます・・・
-
商と剰余を同時に求める(C言語)
-
C言語の配列をC++のvectorに高...
-
std::set<int> で、ある値が何...
おすすめ情報
判定はif文での判定をさせたいと考えています。また、weight10.datの最後の924は誤りです。申し訳ございません。