AcWing-4. 複数のナップザック問題 (Java 実装)

AcWing-4. 複数のナップサック問題

トピックの説明

N個のアイテムと容量Vのバックパックがあります。

i 番目のアイテムは最大 si 個あり、体積は vi、値は wi です。

リュックサックの容量を超えず、合計値が最大になるように、リュックサックにどのアイテムを入れるかを考えます。
最大値を出力します。

入力フォーマット

最初の行では、2 つの整数 N と V がスペースで区切られており、それぞれアイテムの数とバックパックの体積を表しています。

次に N 行があり、各行にはスペースで区切られた 3 つの整数 vi、wi、si があり、それぞれ i 番目の項目の体積、値、数量を表します。

出力フォーマット

最大値を表す整数を出力します。

データ範囲

0<N,V≤100
0<vi,wi,si≤100

入力サンプル:

4 5
1 2 3
2 4 1
3 4 3
4 5 2

出力例:

10

アイデア(プレーンバージョン)

状態表現: f ( i , j )、容量が j を超えない、1 ~ i から選択されたすべての値セットを表します。 状態表現: f(i,j)、容量が j を超えない、1 ~ i から選択されたすべての値セットを表します。状態表現: f ( i ,j ) 1からiまで選択された、容量がj超えないすべてのセットを表します。

属性: 最大 属性: 最大属性最大_ _

コア: 最後の数値 i が取得されないか、k が取得されます (k の最大値は、i の可能な最大の数です) コア: 最後の数値 i が取得されないか、k が取得されます (k の最大値が最大です) i の可能な数 s)コア:最後の数値ikをとらないか kをとります( kの最大i可能な最大のです)

状態分割: f ( i − 1 , j ) は 0 i, 1 i ... ... 、 k i は f ( i , j ) になります。 状態分割: f(i-1,j) は 0 i, 1 i を取ります。 ..,k i は f(i,j) になります州の分割:f (1 j ) 0 i , _をとる1_kf ( i , _j )

状態遷移方程式は状態分割によって取得できます。
f ( i , j ) = Max ( f ( i − 1 , j ) , f ( i − 1 , j − vi ) + wi , f ( i − 1 , j − 2 ∗ vi ) + 2 ∗ wi , … … , f ( i − 1 , j − k ∗ vi ) + k ∗ wi ) f(i,j) = Max(f(i-1,j),f(i - 1,j-vi)+wi,f(i-1,j-2*vi)+2*wi,...,f(i-1,jk*vi)+k*wi)f ( i ,j )=Max ( f ( i _ _1 j ) f (1 jv i )+_f (1 j2v i )+2_f (1 jkv i )+kウィ_

コアコード

		for(int i=1;i<=n;i++) {
    
    
			v = r.nextInt();w = r.nextInt();s = r.nextInt();
			for(int j=1;j<=m;j++) {
    
    
				for(int k=0;k<=s;k++) {
    
    
					if(j<k*v) continue;
					f[i][j] = Math.max(f[i][j],f[i-1][j-k*v]+k*w);
				}
			}
		}

完全なコード

package acWing004;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
public class Main {
    
    
	static int N = 110;
	static int f[][] = new int[N][N];
	static int n,m,v,w,s;
	public static void main(String[] args) throws Exception{
    
    
		Read r = new Read();
		n = r.nextInt();m = r.nextInt();
		for(int i=1;i<=n;i++) {
    
    
			v = r.nextInt();w = r.nextInt();s = r.nextInt();
			for(int j=1;j<=m;j++) {
    
    
				for(int k=0;k<=s;k++) {
    
    
					if(j<k*v) continue;
					f[i][j] = Math.max(f[i][j],f[i-1][j-k*v]+k*w);
				}
			}
		}
		System.out.println(f[n][m]);
	}
}
class Read{
    
    
	StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
	public int nextInt() throws Exception{
    
    
		st.nextToken();
		return (int)st.nval;
	}
}

おすすめ

転載: blog.csdn.net/gudada010/article/details/117514305