算法很美:01背包问题(动态规划、贪心)

题目描述

  • Sidney想去Gandtom家玩。但Sidney家和Gandtom家之间是高低不平、坑坑洼洼的土路。所以他需要用他的背包装几袋稀的泥,在路上铺平一些干的土,使路变成平整的泥土,才能到Gandtom家见到Gandtom。
    已知现在有n种稀的泥,第i种稀的泥的质量为wi,体积为vi。Sidney的包能装体积不超过V的稀的泥。Sidney出门时携带的稀的泥的质量应该尽可能的大。在此前提下,携带的稀的泥的体积也应该尽可能的大。
    试求Sidney最多能携带多少质量的稀的泥与此时的最大体积上路。
  • Input
    第一行有一个整数T,表示组数。
    每组数据第一行有两个正整数n、V(0<n,V<=103) 。
    每组数据第二行有个n正整数,第i个数为wi(0<wi<=106)。
    每组数据第三行有个n正整数,第i个数为vi(0<vi<=103)
  • Output
    每组样例第一行输出两个整数。表示Sidney最多能携带多少质量的稀的泥与此时的最大体积上路。
    Sample Input
2
5 3
1 2 3 4 5
1 1 1 1 1
3 7
1 2 1
3 5 3

Sample Output

12 3
2 6

题目解析

  • 该题用贪心不好保证两个都最大,dp数组每个单元格表示,有j种水泥和i个背包容量的最优装载情况,在dp数组中可以通过dfs寻找每次“选择”的水泥(不过时间复杂度有些高)

代码


	        Scanner scanner=new Scanner(System.in);
	        int T=scanner.nextInt();

	        for (int i = 0; i < T; i++) {
   
   

	            int n=scanner.nextInt();
	            Shuini[] samples=new Shuini[n];
	            int V=scanner.nextInt();
	            for (int j = 0; j < n; j++) {
   
   
	                samples[j]=new Shuini(scanner.nextInt(),0);

	            }
	            for (int j = 0; j < n; j++) {
   
   
	                samples[j].vi=scanner.nextInt();
	                samples[j].getUnitValue();
	            }
	            //贪心算法(无法保证w,v同时最大)
	            //solve(samples,V);

	            //dp动规划
	            solve1(samples,V);
	        }


	    }

	    private static</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值