背包問題貪心算法


背包問題

時間限制: 3000 ms  |  內存限制:65535 KB
難度: 3
 
描述
現在有很多物品(它們是可以分割的),我們知道它們每個物品的單位重量的價值v和重量w(1<=v,w<=10);如果給你一個背包它能容納的重量為m(10<=m<=20),你所要做的就是把物品裝到背包里,使背包里的物品的價值總和最大。
 
輸入
第一行輸入一個正整數n(1<=n<=5),表示有n組測試數據;
隨后有n測試數據,每組測試數據的第一行有兩個正整數s,m(1<=s<=10);s表示有s個物品。接下來的s行每行有兩個正整數v,w。
輸出
輸出每組測試數據中背包內的物品的價值和,每次輸出占一行。
樣例輸入
1
3 15
5 10
2 8
3 9
樣例輸出
65


代碼:
package acm13;

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        while (n-- > 0) {
            int s = sc.nextInt();
            int m = sc.nextInt();
            int a[][] = new int[s][2];
            int temp = 0, sum = 0;
            for (int i = 0; i < s; i++)
                for (int j = 0; j < 2; j++)
                    a[i][j] = sc.nextInt();// 輸入完成
            for (int i = 0; i < s - 1; i++) {
                for (int j = 0; j < s - i - 1; j++) {
                    if (a[j][0] < a[j + 1][0]) {
                        temp = a[j][0];
                        a[j][0] = a[j + 1][0];
                        a[j + 1][0] = temp;

                        temp = a[j][1];
                        a[j][1] = a[j + 1][1];
                        a[j + 1][1] = temp;
                    }
                }
            }
            for (int i = 0; i < s; i++) {
                if (a[i][1] <= m) {
                    sum += a[i][1] * a[i][0];
                    m -= a[i][1];
                } else {
                    sum += a[i][0] * m;
                    break;
                }

            }
            System.out.println(sum);
        }
    }
}

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM