蓝桥杯——说好的进阶之全然背包问题

有N种物品和一个载重量为W的背包,每种物品都有无限件可用。第i种物品的重量是w,价值是p。

将哪些物品装入背包可使这些物品的重量总和不超过背包总重量,且价值总和最大。(对照01背包问题,取或不取与无限件)

static int W=10;
	static int[] w_arr = new int[]{3,2,5,1,6,4};
	static int[] p_arr = new int[]{6,5,10,2,16,8};
	static int[][] v;

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		v=new int[w_arr.length+1][W+1];
		//法一
		cal();
		//改进
		k();
	}

	static void k()
	{
		int[] b=new int[W+1];
		for(int i=0;i<w_arr.length;i++)
		{
			for(int j=w_arr[i];j<=W;j++) //第 i 件取入影响最优解 正向以充分考虑
			{
				b[j]=Math.max(b[j], b[j-w_arr[i]]+p_arr[i]);
			}
		}

		for(int i:b)
		{
			System.out.print(i+" ");
		}
		System.out.println();
		System.out.println(b[W]);

	}

	static void cal()
	{
		for(int i=1;i<v.length;i++)
		{
			for(int j=1;j<v[0].length;j++)
			{
				for(int k=0;k<=j/w_arr[i-1];k++)
				{
						v[i][j]=Math.max(v[i-1][j],v[i-1][j-k*w_arr[i-1]]+k*p_arr[i-1]);
				}
			}
		}

		for(int i[]:v)
		{
			for(int j:i)
			{
				System.out.print(j+" ");
			}
			System.out.println();
		}
		System.out.println(v[w_arr.length][W]);
	}
时间: 2024-08-02 21:06:36

蓝桥杯——说好的进阶之全然背包问题的相关文章

蓝桥杯——说好的进阶之完全背包问题

有N种物品和一个载重量为W的背包,每种物品都有无限件可用.第i种物品的重量是w,价值是p.将哪些物品装入背包可使这些物品的重量总和不超过背包总重量,且价值总和最大.(对比01背包问题,取或不取与无限件) static int W=10; static int[] w_arr = new int[]{3,2,5,1,6,4}; static int[] p_arr = new int[]{6,5,10,2,16,8}; static int[][] v; public static void ma

蓝桥杯——说好的进阶之砝码称重(贪心算法)

5个砝码 用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量. 如果只有5个砝码,重量分别是1,3,9,27,81.则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中). 本题目要求编程实现:对用户给定的重量,给出砝码组合方案. 例如: 用户输入: 5 程序输出: 9-3-1 用户输入: 19 程序输出: 27-9+1 要求程序输出的组合总是大数在前小数在后. 可以假设用户的输入的数字符合范围1~121. public static void main(String

蓝桥杯——说好的进阶之买不到的数目

问题描述 小明开了一家糖果店.他别出心裁:把水果糖包成4颗一包和7颗一包的两种.糖果不能拆包卖. 小朋友来买糖的时候,他就用这两种包装来组合.当然有些糖果数目是无法组合出来的,比如要买 10 颗糖. 你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17.大于17的任何数字都可以用4和7组合出来. 本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字. 输入格式 两个正整数,表示每种包装中糖的颗数(都不多于1000) 输出格式 一个正整数,表示最大不能买到的糖数 样例输入1

蓝桥杯——说好的进阶之入学考试

问题描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:"孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值.我会给你一段时间,在这段时间里,你可以采到一些草药.如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大." 如果你是辰辰,你能完成这个任务吗? 输入格式 第一行有两个整数T(1 <= T <= 10

蓝桥杯——说好的进阶之去重复元素的排列组合

将待排列(组合)的数组,先分别统计出种类和个数,然后进行避免重复的排列(组合). /* 1,1,2,3的排列组合 去重复 * (借此复习排列组合) * * 1:2 2个1 * 2:1 1个2 * 3:1 1个3 * * */ static int[] iarr = new int[3];//目标序列 static int[] carr = new int[] { 1, 2, 3 };//3种item static int[] used = new int[] { 2, 1, 1 };//每种it

蓝桥杯——说好的进阶之和式分解

对于正整数 n,输出和等于 n且组成和式的数字从左至右是非递增的所有正整数和式. 输入: 6 输出: 6=6 6=5+1 6=4+2 6=4+1+1 6=3+3 6=3+2+1 6=3+1+1+1 6=2+2+2 6=2+2+1+1 6=2+1+1+1+1 6=1+1+1+1+1+1 import java.util.Scanner; public class Main{ static int[] a = new int[1000]; public static void main(String

蓝桥杯——说好的进阶之多叉树的遍历

多叉树,简单地说,与二叉树类似的,但叉可能要多的树形结构:类似于计算机文件目录. static class MyTree { private Map map = new HashMap(); public void add(char parent, char child) { List<Character> t = (List<Character>) map.get(parent);// child list if (t == null) { t = new Vector<C

蓝桥杯——说好的进阶之取数博弈游戏(动态规划实现)

今盒子里有n个小球,A.B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断. 我们约定: 每个人从盒子中取出的球的数目必须是:1,3,7或者8个. 轮到某一方取球时不能弃权! A先取球,然后双方交替取球,直到取完. 被迫拿到最后一个球的一方为负方(输方) 请编程确定出在双方都不判断失误的情况下,对于特定的初始球数,A是否能赢? 程序运行时,从标准输入获得数据,其格式如下: 先是一个整数n(n<100),表示接下来有n个整数.

【蓝桥杯单片机10】串行接口的进阶与实战应用

[蓝桥杯单片机10]串行接口的进阶与实战应用 广东职业技术学院 欧浩源 串行接口作为51单片机的重要外设,编程操作并不复杂,但在实际的项目应用中,由于数据结构和通信规约的不同,其程序逻辑也有各种变化,不会像"[蓝桥杯单片机09]串行接口的基本原理与应用"中说的那么简易.      一般情况下,上位机的命令可能不是一个字节,而是多个字节组成的命令帧,有的长度固定,有的长度变化:而且要求返回的数据可能也不是一个字节,可能是一个数组,也有可能是一个字符串等.在蓝桥杯的比赛中,也不可能让你只是