前提・実現したいこと
c言語でナップザック問題を解きたい
重さと価値がそれぞれ w_i, v_i であるような n 個の品物があり、重さの総和がWを超えないように選んだときの価値の総和のの最大値を求める
例1)n = 4、(w, v) = { (2, 3), (1, 2), (3, 4), (2, 2) }、W = 5 → 出力 7
例2)n = 3、(w, v) = { (2, 2), (2, 1), (1, 1), }、W = 5 → 出力 4
発生している問題
組み合わせを総当たりするという部分で躓いています
上記の(例1)でいえば(2,3)(3,4)で済んでいますが、
(例2)ならば(2,2), (2,1), (1,1)になります。取る値が入力次第で変わるのでfor文をどのように回せばいいかがわかりません
考えている流れとしては
総和を超えない組み合わせを探す→価値の最大値を求める→出力です
今回は総当たりの部分のヒントをいただきたいです
該当のソースコード
#include <stdlib.h> int main(void) { int n=0;//品物の個数 int w=0;//求める総和 int w_i[100000];//重さ int v_i[100000];//価値 printf("品物の数"); scanf("%d",&n); if(1 <= n && n <= 100){ }else{ printf("ERROR!\n"); exit(0); } printf("重さと価値\n"); for(int i=0; i<n; i++ ){ scanf("%d , %d",&w_i[i],&v_i[i]); if( 1 <= w_i[i],v_i[i] && w_i[i],v_i[i] <= 100){ }else{ printf("ERROR!\n"); exit(0); } } printf("求める総和"); scanf("%d",&w); if(1 <= w && w <= 10000){ }else{ printf("ERROR!\n"); exit(0); } /* 本体部分何も書けてないです */ return 0; }
試したこと
for(int j=0;j<n;j++){ for(int k=1;k<n;k++){ for(int l=2;l<n;l++){ ・・・・ } } }
のようにforで総当たりを考えましたがこれだと取る値の数が限られるので没
補足情報(FW/ツールのバージョンなど)
Visual Studio Codeを使用しています。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/08 02:08 編集
2019/07/10 00:40
2019/07/10 04:23