zoukankan      html  css  js  c++  java
  • G

    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

    分析:本题是一个完全背包问题,与0-1背包问题十分相似,唯一不同之处就是完全背包问题中的所有物品没有次数限制,而0-1背包中每件物品只能取一次或者不取,所以我们只需在0-1背包的基础上稍加改动即可
    本题我用了两种方法写,前面这种方法好很多,后面那种方法运行慢,不是很好理解,写的时候出现了好多错误
    AC代码:
    解法一:
    #include<iostream> #include<cstdio> #include<cstring> using namespace std; int d[100005]; int a[101]; int b[101]; int max(int a,int b) { return a>b?a:b; } int main() { int n,m; while(~scanf("%d",&n)) { memset(d,0,sizeof(d)); for(int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]); scanf("%d",&m); for(int i=1;i<=n;i++) for(int j=b[i];j<=m;j++) { d[j]=max(d[j],d[j-b[i]]+a[i]); } printf("%d ",d[m]); } }
    解法二:
    #include <iostream>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    int cmp(int x,int y)
    {
        return x>y;
    }
    int main()
    {
        int n,m,i,j;
        int d[100005];
        int a[111];
        int b[111];
        while(~scanf("%d",&n))
        {
            for(i=0; i<n; i++)
                scanf("%d%d",&a[i],&b[i]);
            scanf("%d",&m);
            memset(d,0,sizeof(d));
            d[0]=1;
            for(i=0; i<n; i++)
                for(j=b[i]; j<=m; j++)
                {
                    d[j]=max(d[j],d[j-b[i]]+a[i]);
                }
            sort(d,d+m+1,cmp);
            printf("%d
    ",d[0]-1);
        }
    }
    这种解法最容易出错的地方就是它没有返回值,卡在这里好久,还有就是要注意数组的定义,不建议使用




  • 相关阅读:
    算法训练 表达式计算
    基础练习 十六进制转十进制
    基础练习 十六进制转十进制
    基础练习 十六进制转十进制
    New ways to verify that Multipath TCP works through your network
    TCP的拥塞控制 (Tahoe Reno NewReno SACK)
    Multipath TCP Port for Android 4.1.2
    How to enable ping response in windows 7?
    NS3
    Multipath TCP Port for Android
  • 原文地址:https://www.cnblogs.com/lbyj/p/5750825.html
Copyright © 2011-2022 走看看