01่ๅ ้ฎ้ข๐๐๐๐๐
ๅฟ ็็บ ๆญฃ
ๅจ่ง้ขไธญ๏ผๆๆ v[i] ๅ w[i] ็ปๆๅไบ๏ผๅฐฑๆฏๆ v[i] ็ๆไบไปทๅผ๏ผๆ w[i] ็ๆไบไฝ็งฏใๅคงๅฎถ็็ๆถๅๆณจๆไธไธๅ๏ผๅ ไธบๅฏปๆ v ๅฐฑๆฏ value๏ผๆๆๆฏไปทๅผ๏ผ๏ผ๏ผ
01่ๅ ้ฎ้ข
ๆ N ไปถ็ฉๅๅไธไธชๅฎน้ๆฏ V ็่ๅ ใๆฏ็ง็ฉๅๅชๆไธไปถใ
็ฌฌ i ไปถ็ฉๅ็ไฝ็งฏๆฏ V[i]๏ผไปทๅผๆฏ W[i]ใ
ๆฑ่งฃๅฐๅชไบ็ฉๅ่ฃ
ๅ
ฅ่ๅ
๏ผๅฏไฝฟ่ฟไบ็ฉๅ็ๆปไฝ็งฏไธ่ถ
่ฟ่ๅ
ๅฎน้๏ผไธๆปไปทๅผๆๅคงใ
่พๅบๆๅคงไปทๅผใ
DP ไธ้จๆฒ
1ใdp[i] [v]๏ผๅจ 0….i ไธญ๏ผไฝ็งฏไธบ v ็่ๅ ไธญ๏ผ่ฝๅคๆฟๅฐ็ๆๅคงไปทๅผไธบ dp[i] [v]ใ
2ใๆฑๅ ณ็ณปๅผ
dp[i] [v] dp[i-1] [v] dp[i] [v-x] ๅฏปๆพไธไบๅ ณ็ณปๅผ
dp[i] [v] =
(1)ใๅฏนไบ็ฌฌ i ไปถ็ฉๅ๏ผๅฆๆไธๆฟ็ฌฌ i ไปถ็ฉๅ๏ผๅชๅฉไธ 0…i-1ไปถ็ฉๅ=ใdp[i] [v] = dp[i-1] [v]๏ผ
(2)ใๅฏนไบ็ฌฌ i ไปถ็ฉๅ๏ผๅฆๆ ๆๅฎๆพ่ฟๅ ้๏ผ้ฃๆไปฌๅฐฑ่ฝๅพๅฐไธไธชไปทๅผไธบ v[i] ็็ฉๅ๏ผ
dp[i] [v] = dp[i-1] [v-w[i]] + v[i]ใ
ๆ็ปๅ ฌๅผ๏ผdp[i] [v] = max(dp[i-1] [v-w[i]] + v[i], dp[i-1] [v])
3ใๅๅงๅๆกไปถ
dp[0] [v] = 0
dp[i] [0] = 0
4ใไปฃ็
ไปฃ็ ๅฎ็ฐ
Java
import java.util.Scanner;
public class Main{
public static void main(String[] args) throws Exception {
// ่ฏปๅ
ฅๆฐๆฎ็ไปฃ็
Scanner reader = new Scanner(System.in);
// ็ฉๅ็ๆฐ้ไธบN
int N = reader.nextInt();
// ่ๅ
็ๅฎน้ไธบV
int V = reader.nextInt();
// ไธไธช้ฟๅบฆไธบN็ๆฐ็ป๏ผ็ฌฌiไธชๅ
็ด ่กจ็คบ็ฌฌiไธช็ฉๅ็ไฝ็งฏ๏ผ
int[] v = new int[N + 1] ;
// ไธไธช้ฟๅบฆไธบN็ๆฐ็ป๏ผ็ฌฌiไธชๅ
็ด ่กจ็คบ็ฌฌiไธช็ฉๅ็ไปทๅผ๏ผ
int[] w = new int[N + 1] ;
for (int i=1 ; i <= N ; i++){
// ๆฅไธๆฅๆ N ่ก๏ผๆฏ่กๆไธคไธชๆดๆฐ:v[i],w[i]๏ผ็จ็ฉบๆ ผ้ๅผ๏ผๅๅซ่กจ็คบ็ฌฌiไปถ็ฉๅ็ไฝ็งฏๅไปทๅผ
v[i] = reader.nextInt();
w[i] = reader.nextInt();
}
reader.close() ;
// ๆ ธๅฟๆจกๅผไปฃ็
int[][] dp = new int[N+1][V+1];
// ๅๅงๅ
for(int i = 1; i <= N; i++){
for(int j = 0; j <= V; j++){
if(v[i] > j){
dp[i][j] = dp[i-1][j];
}else{
dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-v[i]] + w[i]);
}
}
}
System.out.println(dp[N][V]);
}
}
Python
def main():
# ่ฏปๅ
ฅๆฐๆฎ็ไปฃ็
# ็ฉๅ็ๆฐ้ไธบN
N, V = map(int, input().split())
# ไธไธช้ฟๅบฆไธบN็ๆฐ็ป๏ผ็ฌฌiไธชๅ
็ด ่กจ็คบ็ฌฌiไธช็ฉๅ็ไฝ็งฏ๏ผ
v = [0] * (N + 1)
# ไธไธช้ฟๅบฆไธบN็ๆฐ็ป๏ผ็ฌฌiไธชๅ
็ด ่กจ็คบ็ฌฌiไธช็ฉๅ็ไปทๅผ๏ผ
w = [0] * (N + 1)
for i in range(1, N + 1):
# ๆฅไธๆฅๆ N ่ก๏ผๆฏ่กๆไธคไธชๆดๆฐ:v[i],w[i]๏ผ็จ็ฉบๆ ผ้ๅผ๏ผๅๅซ่กจ็คบ็ฌฌiไปถ็ฉๅ็ไฝ็งฏๅไปทๅผ
v[i], w[i] = map(int, input().split())
# ๆ ธๅฟๆจกๅผไปฃ็
dp = [[0 for _ in range(V + 1)] for _ in range(N + 1)]
# ๅๅงๅ
for i in range(1, N + 1):
for j in range(V + 1):
if v[i] > j:
dp[i][j] = dp[i - 1][j]
else:
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - v[i]] + w[i])
print(dp[N][V])
if __name__ == "__main__":
main()
C++
#include <iostream>
#include <vector>
using namespace std;
int main() {
// ่ฏปๅ
ฅๆฐๆฎ็ไปฃ็
int N, V;
cin >> N >> V;
vector<int> v(N + 1), w(N + 1);
for (int i = 1; i <= N; i++) {
// ๆฅไธๆฅๆ N ่ก๏ผๆฏ่กๆไธคไธชๆดๆฐ:v[i],w[i]๏ผ็จ็ฉบๆ ผ้ๅผ๏ผๅๅซ่กจ็คบ็ฌฌiไปถ็ฉๅ็ไฝ็งฏๅไปทๅผ
cin >> v[i] >> w[i];
}
// ๆ ธๅฟๆจกๅผไปฃ็
vector<vector<int>> dp(N + 1, vector<int>(V + 1, 0));
// ๅๅงๅ
for (int i = 1; i <= N; i++) {
for (int j = 0; j <= V; j++) {
if (v[i] > j) {
dp[i][j] = dp[i - 1][j];
} else {
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - v[i]] + w[i]);
}
}
}
cout << dp[N][V] << endl;
return 0;
}
Go
package main
import (
"fmt"
)
func main() {
// ่ฏปๅ
ฅๆฐๆฎ็ไปฃ็
var N, V int
fmt.Scan(&N, &V)
v := make([]int, N+1)
w := make([]int, N+1)
for i := 1; i <= N; i++ {
// ๆฅไธๆฅๆ N ่ก๏ผๆฏ่กๆไธคไธชๆดๆฐ:v[i],w[i]๏ผ็จ็ฉบๆ ผ้ๅผ๏ผๅๅซ่กจ็คบ็ฌฌiไปถ็ฉๅ็ไฝ็งฏๅไปทๅผ
fmt.Scan(&v[i], &w[i])
}
// ๆ ธๅฟๆจกๅผไปฃ็
dp := make([][]int, N+1)
for i := 0; i <= N; i++ {
dp[i] = make([]int, V+1)
}
// ๅๅงๅ
for i := 1; i <= N; i++ {
for j := 0; j <= V; j++ {
if v[i] > j {
dp[i][j] = dp[i-1][j]
} else {
dp[i][j] = max(dp[i-1][j], dp[i-1][j-v[i]]+w[i])
}
}
}
fmt.Println(dp[N][V])
}
func max(a, b int) int {
if a > b {
return a
}
return b
}