题意 : 给出 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. Mysql-问题解决记录

    1.查看当前默认的配置文件位置 # mysqld --verbose --help | 'Default options' Default options are read from the foll ...

  2. java8 stream取出 最大值/最小值

    注:转载请注明出处!!! 这里直接用取出多个对象中某个值 最大/最小 来进行举例 直接看代码 /** * 时间测试类 */ class TimeTest { private Date time; pu ...

  3. MySQL索引,备份和还原

    1.索引  1.索引是占硬盘空间 ,也是按页存放的 . 思考题:一个索引页,(数据页)  占用多少个字节  .SQL Server 8192个字节 2.索引:是一种有效组合数据的方式,为了快速查找指定 ...

  4. JAVA基础--JAVA 集合框架(泛型、file类)

    一.集合总结 集合:Collection体系.Map体系. Collection体系:单列集合的共性操作规则. List:列表,可以重复,有下标,拥有特有的迭代器ListIterator. Array ...

  5. C++关于erase的复杂度(转载)

    被这个问题困扰了很多次,有必要整理一下. 当然最好的参考资料就是http://www.cplusplus.com/reference/set/set/erase/ 里的Complexcity部分了,但 ...

  6. eclipse调试openstack的nova代码

    前段时间一直在研究openstack的nova部分的代码.特别想知道,怎样用eclipse来调试代码.也在论坛上问了别人.无果.最后还是自己摸索出了出路. 以下写出自己探索之路.我是用devstack ...

  7. OneinStack定时同步备份数据库/网站至七牛云存储方法

    无论我们用WEB面板,还是用一键脚本安装环境建站,只要一旦我们开始用VPS.服务器,最为关键的就是服务器中的数据.因为大部分VPS.服务器商家都是无管理型主机,任何的安装和维护都需要我们自行管理.即便 ...

  8. java字符流读取文件

    package ba; import java.io.*; public class zifuTest { public static void main(String[] args) { FileI ...

  9. 使用nginx配置二级域名

    使用nginx配置二级域名 2018.11.21 11:51:17字数 613阅读 170 最近想把三个项目配在一个服务器上,于是想使用nginx配置二级域名实现. 1.域名添加解析 我的是阿里云的域 ...

  10. 树莓派上固定ip

    sudo nano /etc/dhcpcd.conf interface eth0 static ip_address=192.168.123.99/24 static routers=192.168 ...