zoukankan      html  css  js  c++  java
  • HDU

    Piggy-Bank

    题目大意:

    T组数据,每组数据一个n,代表n种类型的硬币,首先给你E,F,然后F-E代表背包可容纳总重量,下面给出n种硬币的价值wi和重量vi,每种不限数量,问装满可容纳F-E重量的背包硬币价值最小是多少。如果不能,则输出This is impossible.

    数据范围:

    1n500,1EF10000,1wi50000,1vi10000.

    解题思路:

    题意可简化为,n种物品,每种无数个,装满W重量的背包的最小价值,这是一个完全背包的题,dp[j]代表承重为j的背包的最小价值,转移方程为:

    dp[j]=max(dp[j],dp[jv[i]]+w[i])

    具体见代码

    AC代码:

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int maxn = 10000;
    const int INF = 1e9 + 7;
    int dp[maxn + 5];
    int E, F, W;
    int T, n;
    int w[505], v[505];
    int main() {
        scanf("%d", &T);
        while(T--) {
            for(int i = 0; i <= maxn; i++)dp[i] = INF;//初始化为无穷大
            scanf("%d%d", &E, &F);
            W = F - E;//背包大小
            scanf("%d", &n);
            for(int i = 1; i <= n; i++)scanf("%d%d", &w[i], &v[i]);
            dp[0] = 0;
            for(int i = 1; i <= n; i++) {//虽然每个物体有无限个,但是对于第i个物体,dp[j]可由dp[j-v[i]]转移过来,就达到了取任意多个第i种物体之后的状态
                for(int j = v[i]; j <= W; j++) {
                    dp[j] = min(dp[j], dp[j - v[i]] + w[i]);
                }
            }
            if(dp[W] == INF)printf("This is impossible.
    ");//如果值未改变,说明不存在该状态
            else printf("The minimum amount of money in the piggy-bank is %d.
    ", dp[W]);
        }
        return 0;
    }
  • 相关阅读:
    ROS Learning-015 learning_tf(编程) 编写一个监听器程序 (Python版)
    ROS Learning-014 learning_tf(编程) 坐标系变换(tf)广播员 (Python版)
    2019-05-12 Jave学习日记之运算符&if语句
    2019-05-11 Jave学习日记之进制运算&数据类型
    OpenSession与getCurrentSession的区别
    Hibernate----Hibernate小配置
    Hibernate----配置文件Hibernate.cfg.xml
    SpringMVC
    WebService
    Javamail
  • 原文地址:https://www.cnblogs.com/TRDD/p/9813532.html
Copyright © 2011-2022 走看看