HDU 1114 【DP】

题意:

给你空钱袋的质量和装满钱的钱袋的质量。

给你先行的n种货币的面值和质量。

问钱包里的钱最少是多少。

如果质量不可行,输出impossible。

思路:

完全背包。

屌丝有个地方没想通,就是如何确定是否是impossible。

其实一开始先初始化成inf,然后只要可行的点都会更新dp数组。所以最后如果仍是inf那么代表这个质量不可行。

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int w[600],p[600];
const int inf=0x3f3f3f3f;
int dp[10005];
int main()
{
    int t,n,tar;
    scanf("%d",&t);
    for(int tt=1;tt<=t;tt++)
    {
        int a,b,minn=inf;
        scanf("%d%d%d",&a,&b,&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&p[i],&w[i]);
            minn=min(minn,w[i]);
        }
        tar=b-a;
        for(int i=1;i<=tar;i++)
        {
            dp[i]=inf;
        }
        if(tar<0)
        {
            printf("This is impossible.\n");
            continue;
        }
        else if(tar==0)
        {
            printf("The minimum amount of money in the piggy-bank is 0.\n");
            continue;
        }
        dp[0]=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=w[i];j<=tar;j++)
            {
                dp[j]=min(dp[j-w[i]]+p[i],dp[j]);
            }
        }
        if(dp[tar]==inf)
        {
            printf("This is impossible.\n");
        }
        else
        {
            printf("The minimum amount of money in the piggy-bank is %d.\n",dp[tar]);
        }
    }
}
时间: 2024-08-03 23:45:10

HDU 1114 【DP】的相关文章

HDU 1024 【DP】

题意: 给n个数将其分成连续的m组,使得这些组的数加和最大,组与组之间可以空数. /* dp[i][j]表示将前j个数分成i个组最大值 状态转移方程是: dp[i][j]=max(dp[i-1][0...j-1],dp[i][j-1])+tmp[j]; 内存的优化是用滚动数组记录dp[i][...]和dp[i-1][...] 时间的优化是将dp[i-1][...]用dp[i-1][j]=max(dp[i-1][1...j])代替省去一维时间 并不清楚这道题的复杂度怎么算... 坑点: 1.第一次

HDU 1244 【DP】

题意: 中文. 思路: 先初步处理,用give-take求出每个城市剩的钱. 求解问题转化成使得和不小于0的最长连续字串. 枚举起点,然后当该起点加的和为负时开始枚举下一起点.(这个状态的转移) 2WA原因: 因为扩展了2倍的点使得求解的最长连续的点有可能大于n. #include<stdio.h> #include<algorithm> #include<string.h> using namespace std; int tmp[200015]; int main(

HDU 2050 【dp】【简单数学】

题意: 中文. 思路: 不难发现数学规律是这样的,每次增加的划分区域的数量是每次增加的交点的数量再加一.然后就总结出了递推公式. #include<stdio.h> long long ans[10005]; int main() { ans[1]=2; long long tmp=2; for(int i=2;i<=10000;i++) { ans[i]=ans[i-1]+tmp*2+1; tmp+=2; } int t; scanf("%d",&t); f

hdu 4908 BestCoder Sequence【DP】

题目链接 :http://acm.hdu.edu.cn/showproblem.php?pid=4908 题目大意:给出一个排列,一个m,求出这个排列的连续子序列中有多少个序列式以m为中位数. 由于是一个排列,不会出现重复的数字,记录一下m的位置index,然后以index为分界线,往左求出s[i](表示从i到index之间有多少大于m),b[i](表示从i到index之间有多少小于m),往右求出s[i](表示从index到i之间有多少大于m),b[i](表示从index到i之间有多少小于m).

hdoj 2391 Filthy Rich 【DP】

题目大意:有个二维数组,你从(0,0)出发,最终到(n,m), 在这个二维数组中,每个位置dp[i][j]都有一定量的黄金,你可以拾取,问你最多能失去多少,并且,你的方向有下,右, 斜向下三个方向: 策略:就是每一个都加上它的上方向与左方向的最大值,这样到最后就是最大值.详情见代码 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2391 代码: #include<stdio.h> #include<string.h> int dp[1

HDOJ1176 免费馅饼 【DP】+【经典数塔】

免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 23986    Accepted Submission(s): 8093 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的1

nyoj 325 zb的生日 【DP】||【DFS】

两种方法: 第一种:将总数一半当做背包,用总数-2*最多能装的数目就是所求: 第二种:深搜: zb的生日 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么庆祝生日,经过调查,zb发现C小加和never都很喜欢吃西瓜,而且一吃就是一堆的那种,zb立刻下定决心买了一堆西瓜.当他准备把西瓜送给C小加和never的时候,遇到了一个难题,never和C小加不在一块住,只能

HDOJ4540 威威猫系列故事——打地鼠 【DP】

威威猫系列故事--打地鼠 Time Limit: 300/100 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 1445    Accepted Submission(s): 713 Problem Description 威威猫最近不务正业,每天沉迷于游戏"打地鼠". 每当朋友们劝他别太着迷游戏,应该好好工作的时候,他总是说,我是威威猫,猫打老鼠就是我的工作! 无话

NYOJ16 矩形嵌套 【DP】

矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度).例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中.你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内. 输入 第一行是一个正正数N(0<N<10),表示测试数据组数, 每组