多重背包--java


多重背包

有N種物品和一個容量為V的背包。第i種物品最多有n[i]件可用,每件費用是c[i],價值 是w[i]。求解將哪些物品裝入背包可使這些物品的費用總和不超過背包容量,且價值總和最大
母函數的思想也是如此 給你 價值, 物品數量的限制, 然后湊,

hdu2191

第一種寫法

import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {

            int n = sc.nextInt();
            int m = sc.nextInt();

            int v[] = new int[101];
            int w[] = new int[101];
            int num[] = new int[101];
            for (int i = 0; i < m; i++) {
                v[i] = sc.nextInt();
                w[i] = sc.nextInt();
                num[i] = sc.nextInt();
            }

            int dp[] = new int[10001];
            for (int i = 0; i <= m; i++)
                dp[i] = 0;
            for (int i = 0; i < m; i++) {
                for (int k = 0; k <= num[i]; k++) {
                    for (int j = n; j >= v[i]; j--) {
                        if (dp[j] < dp[j - v[i]] + w[i]) {
                            dp[j] = dp[j - v[i]] + w[i];

                        }
                    }
                }
            }

            System.out.println(dp[n]);
        }
    }
}

 第二種寫法:

package demo2;

import java.util.*;

public class Main {
    public static int sum(int []n){
        int sum=0;
        for(int i=0;i<n.length;i++)
            sum+=n[i];
        return sum;
    }
    public static int back(int []a,int []v,int[]n,int m){
            int sum=sum(n);
            int a1[]= new int[sum];
            int v1[]=new int[sum];
            for(int i=0;i<a.length;i++)
                a1[i]=a[i];
            for(int i=0;i<v.length;i++)
                v1[i]=v[i];
            int k= a.length;
            for(int i=0;i<n.length;i++){
                while(n[i]!=1){
                    a1[k]=a[i];
                    v1[k]=v[i];
                    k++;
                    n[i]--;
                }
            }
            int dp[]=new int[m+1];
            for(int i=0;i<a1.length;i++){
                for(int j=m;j>=a1[i];j--){
                    dp[j] = Math.max(dp[j],dp[j-a1[i]]+v1[i]);
                }
            }
            return dp[m];
    }

    public static void main(String[] args) {
        int[] a = {1,2,3};
        int[] v = {2,1,4};
        int[] n = {5,4,2};
        int m = 6;
        int value = back(a,v,n,m);
        System.out.println(value);

    }
}

優化寫法:

將多重背包轉換為完全背包

     
    public class duochongbeibao1 {
        public static int[] a = {1,2,3};//重量
        public static int[] v = {2,1,4};//價值
        public static int[] n = {5,4,2};//數量
        public static int m = 6;
        public static int back(int[] a,int[] v,int[] n,int m){
            int value = fun(a.length-1,m);
            return value;
        }
        public static int fun(int i,int m){
            if(i == 0)
                return(m/a[i]<n[i]?m/a[i]:n[i])*v[i];
            else{
                int x = (m/a[i]<n[i]?m/a[i]:n[i]) + 1;
                int[] dp = new int[x];
                for(int j = 0;j<x;j++)
                    dp[j] = fun(i-1,m-j*a[i])+j*v[i];
                return max(dp);
            }
        }
        public static int max(int[] dp){
            int index = 0;
            if(dp.length == 0)
                return -1;
            for(int i = 1;i<dp.length;i++){
                if(dp[i]>dp[index])
                    index = i;
            }
            return dp[index];
        }
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            int value = back(a,v,n,m);
            System.out.println(value);
        }
 
    }

 


免責聲明!

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



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