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
}

ๅ‘่กจ่ฏ„่ฎบ

ๅŽๆ‰่ƒฝ่ฏ„่ฎบ