Dima and Salad

Dima and Salad

https://ac.nowcoder.com/acm/problem/110246

题意:
给出n个物品的ai和bi的值,求在满足所选物品ai之和除以bi之和等于k时ai之和最大为多少?

思路:
将每一个物品的ai看成价值,ai-bi*k看成体积,这样题目就变成了所选物品体积为0时价值最大为多少?给体积一开始就加上一个较大的值来解决下标为负的问题,这样就只是一个简单的01背包问题了。

代码:

#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <iostream>

using namespace std;

typedef long long ll;
const ll inf=1e9+7;
const int N=105;

string s;
int a[N], b[N];
struct w
{
    int v, w;
} w[N];

int dp[105][300005];

int main()
{
    ll n, k;
    scanf("%lld%lld",&n,&k);
    fill(dp[0],dp[0]+105*100005,-inf);
    for(int i=1; i<=n; i++)
    {
        scanf("%d",&a[i]);
    }
    for(int i=1; i<=n; i++)
    {
        scanf("%d",&b[i]);
        w[i].v=a[i];
        w[i].w=a[i]-b[i]*k;
    }
    int ans=0, base=150000;
    dp[0][base]=0;
    for(int i=1; i<=n; i++)
    {
        for(int j=-100000; j<=100000; j++)
        {
            dp[i][base+j]=max(dp[i-1][base+j-w[i].w]+w[i].v,dp[i-1][j+base]);
            if(j==0)
            {
                ans=max(ans,dp[i][base]);
            }
        }
    }
    if(ans==0)
    {
        ans=-1;
    }
    cout << ans << endl;
    return 0;
}

每日一题题解 文章被收录于专栏

写题解

全部评论

相关推荐

喜欢走神的孤勇者练习时长两年半:池是池,发是发,我曾池,我现黑
点赞 评论 收藏
分享
10-28 11:04
已编辑
美团_后端实习生(实习员工)
一个2人:我说几个点吧,你的实习经历写的让人觉得毫无含金量,你没有挖掘你需求里的 亮点, 让人觉得你不仅打杂还摆烂。然后你的简历太长了🤣你这个实习经历看完,估计没几个人愿意接着看下去, sdk, 索引这种东西单拎出来说太顶真了兄弟,好好优化下简历吧
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务