求助站外题
  • 板块题目总版
  • 楼主How1ver
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/4/18 21:10
  • 上次更新2023/10/28 03:21:28
查看原帖
求助站外题
510823
How1ver楼主2022/4/18 21:10

高桥去一个比萨店买比萨。 店里有nn种比萨出售,第ii种的价格为p_ip i ​ 元,美味度为d_id i ​ 。比萨店正在开业酬宾,每购买1个比萨,就可以免费获得一个售价更小的比萨。 于是高桥君重复以下购买比萨的过程: (1)选择一个比萨(假设是第ii种),花费p_ip i ​ 元购买第ii种比萨。 (2)从价格小于p_ip i ​ 元的比萨中选择一个,免费获得这个比萨。 高桥只有KK元,通过合理选择每次购买和免费获得的比萨,他最多可以得到的最大美味度的总和是多少? 【输入格式】 第1行,两个正整数n,Kn,K

接下来nn行,每行2个正整数p_i,d_ip i ​ ,d i ​ ,表示第ii种比萨的价格和美味度 【输出格式】 1个整数,美味度总和的最大值 【输入输出样例#1】 输入#1 3 64 15 17 5 6 33 39 复制 输出#1 102 复制 【输入输出样例#2】 输入#2 5 94 4 2 12 10 16 7 2 4 9 5 复制 输出#2 276 复制 【输入输出样例#3】 输入#3 8 8587 181 89 133 464 29 2 379 434 86 351 8 103 902 489 1 124 复制 输出#3 1949022 复制 【说明提示】 样例1说明:

高桥购买3次比萨:

第1次购买1个第3种比萨,花费33元,然后还可以免费获得一个第1种比萨,美味度为39+17=5639+17=56

第2次购买1个第2种比萨,花费15元,然后还可以免费获得一个第2种比萨,美味度为17+6=2317+6=23

第3次购买1个第2种比萨,花费15元,然后还可以免费获得一个第2种比萨,美味度为17+6=2317+6=23

总美味度为56+23+23=10256+23+23=102 【数据范围】 用背包ok

#include <bits/stdc++.h>
using namespace std;
int n,k,p[305],d[305],dp[10005],pd[305];
int main()
{
    cin>>n>>k;
    for (int i=1;i<=n;i++)
    {
        cin>>p[i]>>d[i];
    }
    for (int i=1;i<=n;i++)
    {
        pd[i]=d[i];
        for (int j=1;j<=n;j++)
        {
            if (p[i]>p[j])
            {
                pd[i]=max(pd[i],d[i]+d[j]);
            }
        }
    }
    for (int i=1;i<=n;i++)
    {
        for (int j=p[i];j<=k;j++)
        {
            dp[j]=max(dp[j],dp[j-p[i]]+pd[i]);
        }
    }
    int ans=0;
    for (int i=1;i<=k;i++)
    {
        ans=max(ans,dp[i]);
    }
    cout<<ans;
    return 0;
}
2022/4/18 21:10
加载中...