美文网首页
ACM 之 G - 湫湫系列故事——减肥记

ACM 之 G - 湫湫系列故事——减肥记

作者: Gadore千里 | 来源:发表于2016-08-12 18:06 被阅读34次

    Description

    对于吃货来说,过年最幸福的事就是吃了,没有之一!
    但是对于女生来说,卡路里(热量)是天敌啊!
    资深美女湫湫深谙“胖来如山倒,胖去如抽丝”的道理,所以她希望你能帮忙制定一个食谱,能使她吃得开心的同时,不会制造太多的天敌。
    当然,为了方便你制作食谱,湫湫给了你每日食物清单,上面描述了当天她想吃的每种食物能带给她的幸福程度,以及会增加的卡路里量。

    Input

    输入包含多组测试用例。
    每组数据以一个整数n开始,表示每天的食物清单有n种食物。
    接下来n行,每行两个整数a和b,其中a表示这种食物可以带给湫湫的幸福值(数值越大,越幸福),b表示湫湫吃这种食物会吸收的卡路里量。
    最后是一个整数m,表示湫湫一天吸收的卡路里不能超过m。

    [Technical Specification]

    1. 1 <= n <= 100
    2. 0 <= a,b <= 100000
    3. 1 <= m <= 100000

    Output

    对每份清单,输出一个整数,即满足卡路里吸收量的同时,湫湫可获得的最大幸福值。

    Sample Input

    3
    3 3
    7 7
    9 9
    10
    5
    1 1
    5 3
    10 3
    6 8
    7 5
    6

    Sample Output

    10
    20

    理解

    学习背包算法的过程是一个痛苦的过程,看起来挺复杂的问题,一个公式就完美的解决问题了。我做这道题的时候是直接去学习背包的,就是一个一个例子的写下来,然后理解公式的工作原理。
    总之,没学习的赶紧去学习吧。伟大的背包!

    代码部分

    #include <cstdio>
    #include <cstring>
    using namespace std;
    int va[1001],vo[1001],dp[1001],t,n,v,i,j;
    inline int Max(int x,int y)
    {return x>y?x:y;}
    int main()
    {
        scanf("%d",&t);getchar();
        while(t--)
        {
            scanf("%d%d",&n,&v);getchar();
            for(i=1;i<=n;i++)
                scanf("%d",&va[i]);
            getchar();
            for(i=1;i<=n;i++)
                scanf("%d",&vo[i]);
            getchar();
            memset(dp,0,sizeof(dp));
            for(i=1;i<=n;i++)
                for(j=v;j>=vo[i];j--)
                    dp[j]=Max(dp[j],dp[j-vo[i]]+va[i]);//这就是背包公式
            printf("%d\n",dp[v]);
        }
        return 0;
    }
    

    意见反馈 || 任何建议

    联系我(新浪)
    邮箱:qianlizhihao@gmail.com

    相关文章

      网友评论

          本文标题:ACM 之 G - 湫湫系列故事——减肥记

          本文链接:https://www.haomeiwen.com/subject/kjresttx.html