返回题解分享
讨论 / 题解分享/ 帖子详情

01背包 - 题解

import  java.util.*;
public class Main{
    static int N, m;
    static int v[];
    static int w[];
    static int res = 0;

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

        m = scan.nextInt();//背包容量
        N = scan.nextInt(); //N件物品
        w = new int[N + 1]; //物品的体积
        v = new int[N + 1];//物品所占的价值
        for (int i = 1; i <= N; i++) {
            w[i] = scan.nextInt();//物品的体积
            v[i] = scan.nextInt();//物品所占的价值
        }
//        System.out.println(dfs(1,m));
        //一维写法;
        int dp[] = new int[m + 1];
        for (int i = 1; i <= N; i++) {
            //从后往前遍历的原因是,dp[j]是dp[j-w[i]]的后一个状态;
            for (int j = m; j >= w[i]; j--) {//容量能装下wi;
                dp[j] = Math.max(dp[j], dp[j - w[i]] + v[i]);
            }
        }
        System.out.println(dp[m]);
    }
}
//        //        int dp[][]=new int[N+1][m+1];
//        //二维写法,i为物品个数,j为体积;
////        for(int i=1;i<=N;i++){
////          for (int j=1;j<=m;j++){
////              if(j<w[i]){  //如果当前面积装不下w[i]件物品
////                  dp[i][j]=dp[i-1][j];
////              }else{
////                  dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);
////              }
////                 }
////            }
//        System.out.println(dp[N][m]);
//        }
                            dfs写法 
//    private static int dfs(int x,int spy) {
//        if(x>N){
//            return 0;
//        }else{
//            if(spy<w[x]){ //当前背包容量装不下w[x]
//                return dfs(x+1,spy);
//            }else {
//                return Math.max(dfs(x+1,spy),dfs(x+1,spy-w[x])+v[x]);
//            }
//        }
//    }
//}
0 回复 0 转发 1 喜欢 0 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!