题意 : 给出 6 枚硬币的面值,然后要求求出对于 1~100 要用所给硬币凑出这 100 个面值且要求所用的硬币数都是最少的,问你最后使用硬币的平均个数以及对于单个面值所用硬币的最大数。

分析 : 

问题建模就是属于完全背包了,但是和普通的完全背包不一样,这题可以使用硬币的负数值,其实面对负数面值的情况,解决方法将更新数序和普通完全背包的更新顺序相反即可,然后正反更新两次就能得出最后的答案了。在普通物品重量只有正数的情况下对于一个 dp[i] 是从下标值小于 i 的状态转移而来,为了达到物品能够无限取这一条件 ( 可以参考《挑战程序设计竞赛》里面对于完全背包递推式子的解释 ) ,而负数重量的时候 dp[i] 是从下标值大于 i 的状态转移而来,故更新方向需和正数重量相反,其实这么说也是很抽象的,建议还是先去看看《挑战》里面对于完全背包原来的分析可能比较好理解。然后有一点值得注意的就是如果 dp 数组下标的更新需要开到起码 1400 ==> 考虑 1、96、97、98、99、100 这一个例子,如果要凑成 ( 1 + 96 ) / 2 的话大概需要 25个左右 也就是需要使用大概需要25/2=13个面值为 100 的硬币,价值能达到 1300.....

import java.io.*;
import java.lang.reflect.Array;
import java.util.*;
import java.math.*;
import java.util.Arrays;
public class Main {
    public static void main(String[] args){
        Scanner cin = new Scanner (new BufferedInputStream(System.in));
        int[] dp = new int[2333];
        int[] arr1 = new int[6];
        int[] arr2 = new int[6];
        int nCase;
        final int num = 6;
        nCase = cin.nextInt();
        for(int Case=1; Case<=nCase; Case++){

            for(int i=0; i<num; i++) arr1[i] = cin.nextInt();
            for(int i=0; i<num; i++) arr2[i] = -arr1[i];

            for(int i=0; i<2333; i++) dp[i] = 1000000;
            dp[0] = 0;
            for(int i=0; i<num; i++)
                for(int j=arr1[i]; j<=2000; j++)
                    dp[j] = Math.min(dp[j], dp[j-arr1[i]] + 1);

            for(int i=0; i<num; i++)
                for(int j=2000-arr2[i]; j>=0; j--)
                    dp[j] = Math.min(dp[j], dp[j-arr2[i]] + 1);

            int MaxNUM = 0;
            double Sum = 0;
            for(int i=0; i<=100; i++){
                MaxNUM = Math.max(dp[i], MaxNUM);
                Sum += (double)dp[i];
            }

            System.out.printf("%.2f %d\n", Sum/100.0, MaxNUM);

        }
    }
}

POJ 1252 Euro Efficiency ( 完全背包变形 && 物品重量为负 )的更多相关文章

  1. POJ 1252 Euro Efficiency(完全背包, 找零问题, 二次DP)

    Description On January 1st 2002, The Netherlands, and several other European countries abandoned the ...

  2. POJ 1252 Euro Efficiency(最短路 完全背包)

    题意: 给定6个硬币的币值, 问组成1~100这些数最少要几个硬币, 比如给定1 2 5 10 20 50, 组成40 可以是 20 + 20, 也可以是 50 -10, 最少硬币是2个. 分析: 这 ...

  3. POJ 1252 Euro Efficiency

    背包 要么 BFS 意大利是说给你几个基本的货币,组成 1~100 所有货币,使用基本上的货币量以最小的. 出口 用法概率.和最大使用量. 能够BFS 有可能 . 只是记得数组开大点. 可能会出现 1 ...

  4. Euro Efficiency(完全背包)

    Euro Efficiency Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 20000/10000K (Java/Other) Tot ...

  5. POJ 3211 Washing Cloths(01背包变形)

    Q: 01背包最后返回什么 dp[v], v 是多少? A: 普通01背包需要遍历, 从大到小. 但此题因为物品的总重量必定大于背包容量, 所以直接返回 dp[V] 即可 update 2014年3月 ...

  6. [POJ 2184]--Cow Exhibition(0-1背包变形)

    题目链接:http://poj.org/problem?id=2184 Cow Exhibition Time Limit: 1000MS   Memory Limit: 65536K Total S ...

  7. poj 2184 Cow Exhibition(背包变形)

    这道题目和抢银行那个题目有点儿像,同样涉及到包和物品的转换. 我们将奶牛的两种属性中的一种当作价值,另一种当作花费.把总的价值当作包.然后对于每一头奶牛进行一次01背包的筛选操作就行了. 需要特别注意 ...

  8. POJ 2392 Space Elevator(多重背包变形)

    Q: 额外添加了最大高度限制, 需要根据 alt 对数据进行预处理么? A: 是的, 需要根据 alt 对数组排序 Description The cows are going to space! T ...

  9. POJ 2184 Cow Exhibition (01背包变形)(或者搜索)

    Cow Exhibition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10342   Accepted: 4048 D ...

随机推荐

  1. VBA文件操作

    做这些东西主要是为了,实现,我们的最终目标. 查到 两个大表里面的变化数据. 所以 这次 ①实现了 文件操作的一部分内容. 包括,excel的打开.分四个步骤. 1.路径 2.打开工作博 3.操作 4 ...

  2. Cocos2d-X网络编程(3) Cocos2d中的网络通信协议——WebSocket协议

    WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器全双工通信.实现浏览器与服务器的即时通讯.即服务器也能主动向客户端发消息. WebSocket代理类和方法: co ...

  3. Python文档操作

    1.打开和关闭文件 open('C:\Users\Second One\Desktop\a.txt')文件路径必须完整路径且为字符串格式 有三种方式: open('C:\\Users\\Second ...

  4. selenium:css_selector定位详解(css selector和xpath的比较)

    selenium使用css selector和xpath的比较 selenium提供的定位方式(常用) ID NAME CLASS CSS SELECTOR XPATH   推荐的定位方式的优先级 优 ...

  5. 使用原生js 获取用户访问项目的浏览器类型

    想要获取浏览器的类型很简单,网上提供了很多方法,但是看过之后,都是根据浏览器内核来判断是ie,谷歌,火狐,opeara的, 所以不能进一步判断在国内使用的主流浏览器类型,比如360,百度,搜狐浏览器等 ...

  6. mysql 修改成utf8编码

    参考文档 https://www.cnblogs.com/chenshuo/p/4743144.html

  7. 在SSIS包中使用 Checkpoint从失败处重新启动包[转]

    使用SSIS做ETL的过程中会遇到各种各样的错误,对于一些大数据量的Job失败以后我们不希望重新运行,因为重新运行的时间开销是非常大的,我们只希望从失败的部分开始运行,这样可以省去很多的时间. SSI ...

  8. [LeetCode] 137. 只出现一次的数字 II

    题目链接 : https://leetcode-cn.com/problems/single-number-ii/ 题目描述: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三 ...

  9. POJ练习计划

    题目链接:https://cn.vjudge.net/article/348 2019/7/24: [POJ-1423] [题解] [POJ-1503] 模板题

  10. 如何使用js在移动端和PC端居中

    在手机移动端和PC端控制居中是一个很蛋痛的问题,因为屏幕宽度在变化,所以就不要写死样式,那么我想用JS来控制,灵活的控制宽度,需要注意这三个时候: (1)首先需要在页面刚加载的时候就调用此函数, (2 ...