首页 > 移动平台 > 详细

算法实验12:捡苹果(完全背包+贪心)

时间:2019-10-30 14:03:52      阅读:331      评论:0      收藏:0      [点我收藏+]

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;
}

 

算法实验12:捡苹果(完全背包+贪心)

原文:https://www.cnblogs.com/LLLAIH/p/11764258.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!