zoukankan      html  css  js  c++  java
  • hdu 1114 dp(01背包)

    View Code
    //hdu  1114  dp(01背包)
    
    //题意为 用各种币种填满储蓄罐(有给出满是的质量),若能填满
    //输出填满后的最小价值,若填不满则输出不可能
    
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    
    using namespace std;
    
    #define INF 1<<28
    #define N 10005
    
    int empty, full;
    int dp[N], val[505], w[505];
    
    int main()
    {
        int n_case;
        scanf("%d", &n_case);
        while(n_case--)
        {
            scanf("%d%d", &empty, &full);
            full -= empty;
    
            for(int i = 0; i <= full; ++i)
                dp[i] = INF;
    
            int n_curren;
            scanf("%d", &n_curren);
    
            for(int i = 0; i < n_curren; ++i)
                scanf("%d%d", &val[i], &w[i]);
    
            //转移方程 dp[i] = min{ dp[j], dp[j-w[i]] + val[j] }
            //表示从质量为 j-w[i] 的状态下向 质量为j 的状态转移时
            //记录 质量为j 时的最小价值即可,若所有硬币中,所有质量组合中
            //不能达到full 则 dp[full - w[i]] 到 dp[full] 就不可能转移成功
    
            dp[0] = 0;  //质量为0 时,即没放任何硬币时,价值为0
            for(int i = 0; i < n_curren; ++i)
                for(int j = w[i]; j <= full; ++j)//从前往后推,质量累加上去,若能填满
                    dp[j] = min(dp[j], dp[j - w[i]] + val[i]);  //则dp[full]就会被赋值
    
            if(dp[full] == INF)
                puts("This is impossible.");
            else
                printf("The minimum amount of money in the piggy-bank is %d.\n", dp[full]);
        }
    }
  • 相关阅读:
    centos7安装rlwrap
    Linux CentOS 7的图形界面安装(GNOME、KDE等)
    在oracle下我们如何正确的执行数据库恢复
    Viewer.js 图片预览插件使用
    深拷贝和浅拷贝
    ES6 export,import报错
    Yarn 命令详解
    npm命令 VS yarn命令
    Windows下nginx作为静态资源服务器使用
    关于Vue脚手架写法的问题
  • 原文地址:https://www.cnblogs.com/gabo/p/2446704.html
Copyright © 2011-2022 走看看