全探索2
- 4. ナップサック問題
●
重さ W[i] と価値 V[i] が決まっている N 個の品物
がある。重さの総和が S を超えないように品物
を選んだときの、それらの品物の価値の総和の最
大値を求めよ。
1≦N≦20
1≦W[i],V[i]≦1,000,000
1≦S≦1,000,000
●
重さを値段、価値を美味しさにすると予算内で最
高の食事をする問題などにあたる
- 15. 初期状態 0P
0,300
1,150
選んだ
100P
選ばなかった
1,300
選んだ
選ばなかった
100P
350P
2,150
2,-50
選んだ 選ばなかった
3,50
150P
0P
選んだ
選ばなかった
250P
0P
1,300
2,100
選んだ 選ばなかった
100P
3,150
3 本目
300P
3,0
選んだ
250P
選ばなかった
3,100
50P
3,50
0P
3,150
- 16. 初期状態 0P
0,300
1,150
選んだ
100P
選ばなかった
1,300
選んだ
選ばなかった
100P
350P
2,150
2,-50
選んだ 選ばなかった
3,50
150P
0P
選んだ
選ばなかった
250P
0P
1,300
2,100
選んだ 選ばなかった
100P
3,150
3 本目
300P
3,0
選んだ
250P
選ばなかった
3,100
50P
3,50
0P
3,150
- 17. 初期状態 0P
0,300
1,150
選んだ
100P
選ばなかった
1,300
選んだ
選ばなかった
100P
350P
2,150
2,-50
選んだ 選ばなかった
3,50
150P
0P
選んだ
選ばなかった
250P
0P
1,300
2,100
選んだ 選ばなかった
100P
3,150
3 本目
300P
3,0
選んだ
250P
選ばなかった
3,100
50P
3,50
0P
3,150
- 19. int N,S,W[20],V[20];
int ans = 0; // 答えの変数
void nap(int T,int U,int i){ // 使ったお金 T 、選ん
だ品物の価値の合計 U 、見終わった品物の数 i
if(i==N){ ans = max(ans , U); return 0; }
//N 個見終わった→終了 答えの変数を更新
if(T+W[i]<=S)nap(T+W[i],U+V[i],i+1); // 選んだ
nap(T,U,i+1); // 選ばなかった
}
// nap(0,0,0) が答え