zoukankan      html  css  js  c++  java
  • 算法实验12:捡苹果(完全背包+贪心)

    Description

    以前,有个神秘的院子里面有三种苹果,每个苹果的数量是无限的。有一个小姑娘带了一个大袋子来到院子,她从来没见过这么多的苹果。每种苹果都有大小以及出售的价格,小姑娘想获得最大的利润,但是她不知道怎么才能做到。于是她来向你寻求帮助,你能告诉她能获得的最大价值吗?

    Input

    第一行一个整数T(T <= 50),表示测试数据的组数。

    每组测试数据有四行组成,前三行每行有两个整数S和P,分别表示每种苹果的大小(1 <= S <= 100)和价格(1 <= P <= 10000)

    第四行有一个整数V(1 <= V <= 100,000,000)表示小姑娘袋子的大小。

    Output

    每组测试数据输出组数和小姑娘能得到的最大的价值。

    Sample Input

    1
    1 1
    2 1
    3 1
    6

    Sample Output

    Case 1: 6

    HINT

    背包容量100000000太大了,一维数组开不了。

    就先去一大部分容量来装性价比最高的苹果,即(价格/重量)最大的苹果。

    剩下一小部分的背包容量使用完全背包。

    #include <iostream>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    const int inf = 0x3f3f3f3f;
    typedef long long ll;
    struct Node {
        ll s,p;
        double v;
    }node[4];
    bool cmp(Node p,Node q) {
        return  p.v < q.v;
    }
    ll dp[1101];
    int main()
    {
        int t,v,k = 0;
        cin >> t;
        while(t--) {
            k++;
            for(int i = 0; i < 3; i++) {
                cin >> node[i].s >> node[i].p;
                node[i].v = node[i].s*1.0/node[i].p;
            }
            cin >> v;
            sort(node,node + 3,cmp);
            ll ans = 0;
            if(v > 1000) {
                ans = ((v-1000)/node[0].s)*node[0].p;
                v = 1000 + (v-1000)%node[0].s;
            }
            memset(dp,0,sizeof(dp));
            for(int i = 0; i < 3; i++) {
                    for(ll j = node[i].s; j <= v; j++) {
                        dp[j] = max(dp[j],dp[j-node[i].s] + node[i].p);
                }
            }
            ans += dp[v];
            cout <<"Case " << k << ": " << ans << endl;
        }
        return 0;
    }
  • 相关阅读:
    Python-pymysql
    MySQL学习(3)
    MySQL学习(1)
    MySQL与PostgreSQL哪个更好?
    svn与git区别
    journalctl常用命令
    Spring Cloud 生产环境性能优化
    springcloud优雅停止上下线与熔断
    istio基础详解
    微服务的全链路监控
  • 原文地址:https://www.cnblogs.com/LLLAIH/p/11764258.html
Copyright © 2011-2022 走看看