Piggy-Bank HDU - 1114

完全背包
题目描述:有一个小猪存钱罐,求在正好的重量的情况下的,存钱的最小值,如果不能满重输出This is impossible.
解题分析:不限次数,完全背包,因为是求最小值,所以初始化时是满重,但是dp[0]必须得是0,不然dp[j] = min (dp[j], dp[j-w[i]] + v[i])这个式子没法更新。思考一个问题,为什么当最终dp[w] = INF的时候,就是不能正好的情况呢?注意观察上面的状态转移方程,只有当dp[j-w[i]] != INF的时候,这个式子才会更新,也就是说当dp[j-w[i]] != INF时,
dp[j-w[i]] 一定可以由确切数目的硬币组成,前面递推同理。所以最终如果dp[w]更新过,则一定可以有确切的硬币数组成重量正好是w的情况。

代码如下:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;

const int INF = 0x3f3f3f3f;
const int maxn = 10000 + 10;
int w[maxn];
int v[maxn];
int dp[maxn];
int W,N;

int main()
{
    int kase;
    cin >> kase;
    while(kase--)
    {
        int E,F;
        scanf("%d %d",&E,&F);
        W = F - E;
        cin >> N;
        for(int i = 1; i <= N; i++)
        {
            scanf("%d %d",&v[i],&w[i]);
        }
        memset(dp,0x3f,sizeof(dp));
        dp[0] = 0;
        for(int i = 1; i <= N; i++)
        {
            for(int j = w[i]; j <= W; j++)
            {
                dp[j] = min (dp[j], dp[j-w[i]] + v[i]);
            }
        }
        if(dp[W] != INF ) printf("The minimum amount of money in the piggy-bank is %d.\n",dp[W]);
        else printf("This is impossible.\n");
    }
    return 0;
}


全部评论

相关推荐

不愿透露姓名的神秘牛友
06-30 18:19
点赞 评论 收藏
分享
叶扰云倾:进度更新,现在阿里云面完3面了,感觉3面答得还行,基本都答上了,自己熟悉的地方也说的比较细致,但感觉面试官有点心不在焉不知道是不是不想要我了,求阿里收留,我直接秒到岗当阿里孝子,学校那边的房子都退租了,下学期都不回学校,全职猛猛实习半年。这种条件还不诱人吗难道 然后现在约到了字节的一面和淘天的复活赛,外加猿辅导。华为笔试完没动静。 美团那边之前投了个base广州的,把我流程卡麻了,应该是不怎么招人,我直接简历挂了,现在进了一个正常的后端流程,还在筛选,不知道还有没有hc。
点赞 评论 收藏
分享
06-27 15:29
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务