白準12865号:普通リュック
13540 ワード
問題の説明
これは
01 knapsack
という構造化アルゴリズムの問題である.方法
배낭의 남은 무게
に基づいてアクセスする必要があります.なぜ重い位置から探求するのですか?
正解
import java.util.*;
public class Main {
static class material{ // 물건의 무게와 가치를 담기 위한 클래스
int W,V;
public material(int w, int v) {
super();
W = w;
V = v;
}
@Override
public String toString() {
return "material [W=" + W + ", V=" + V + "]";
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StringTokenizer st = new StringTokenizer(sc.nextLine()," ");
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
material[] M = new material[N]; // 물건을 담을 배열
for (int i = 0; i < N; i++) {
st = new StringTokenizer(sc.nextLine()," ");
M[i] = new material(Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()));
}
int[] dp = new int[K+1]; // 여유공간이 0일때부터 K일때까지를 나타내는 dp배열
dp[0] = 0;
for (int j = 0; j < N; j++) { // 물건
for (int i = K; i >= M[j].W; i--) { // 남은 무게
if(i-M[j].W<0)continue; // 여유공간보다 물건이 더 무거우면 패스
dp[i] = Math.max(dp[i],dp[i-M[j].W]+ M[j].V); //
//i = 7, j물건의 무게 = 3, j물건의 가치 = 6이라고 할 때
//이전에 구한(==다른j로 구한) 7로 채울 수 있는 최댓값과 현재 j를 넣었을 때의 값을 비교합니다
//j를 넣었을 때의 가치는 'j의 가치 + (i-j의 무게)일때 최적의 가치' 입니다
}
}
// System.out.println(Arrays.toString(dp));
System.out.println(dp[K]);
}
}
その他
まちがった理由
余剰重量を使用する概念はありません.
初期設計コードの反例
1 2
1 3
バッグに2キロの空き重量【1キロ、3元】のものが入っている場合
物は一つしか存在しないので、三元の結果があるはずです.一キロの物は一度入れて、一キロの空きスペースです.
私のアルゴリズムはそれを考えず、1 kgのものを2回だけ入れた結果、6元になりました.
逆ナビゲーションはなぜ重複を阻止しますか?
...大まかな説明方法を理解できる場所。
Reference
この問題について(白準12865号:普通リュック), 我々は、より多くの情報をここで見つけました https://velog.io/@qwerty1434/백준-12865번-평범한-배낭テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol