解题思路:经典的01背包解法,比较简单

注意事项:这里使用了逆序的一维dp数组来存放价值结果,需要小心的是dp的大小是比钱的数量多一位的,比较方便观察,要注意将01背包问题中的value改为value*重要程度。这里创建购买物品的类时没有把重要程度作为对象属性输入,个人认为这样比较简洁。

参考代码:

import java.util.Scanner;
import java.util.ArrayList;
public class Main {

    public static void main(String[] args){
    	Scanner scan = new Scanner(System.in);
    	String[] input = scan.nextLine().split(" ");
    	int Money = Integer.parseInt(input[0]);
    	int Number = Integer.parseInt(input[1]);
    	ArrayList<buy> a = new ArrayList<buy>();
    	for (int i = 0; i < Number; i++) {
    		input = scan.nextLine().split(" ");
    		a.add(new buy(Integer.parseInt(input[0]),Integer.parseInt(input[1])));
    	}
    	scan.close();
    	System.out.println(shop(Money,Number,a));
    	
    }//main
    public static int shop(int m,int n,ArrayList<buy> a) {
    	int[] dp = new int[m+1];
    	for (int i = 1; i < n+1; i++) {
    		for (int j = m; j > a.get(i-1).money; j--) {
    			dp[j] = Math.max(dp[j], dp[j-a.get(i-1).money] + a.get(i-1).value);		
    		}
    	}
    	return dp[m];
    }
}//Class Main
	class buy {
		int money;
		int value;
		buy(int a,int b){
			this.money = a;
			this.value = a * b;
		}
	}


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论