CodeForces - 366C Dima and Salad

Posted on 2022-02-06 16:32  Capterlliar  阅读(31)  评论(0编辑  收藏  举报

题意:每个水果有美味值a和能量值b,当美味值之和是能量值之和的k倍时,求最大的美味值之和。

解:它长得像背包题,但是没有背包体积。它的限制是sum a = k * sum b ,移项得 sum a - k * sum b = 0 ,将b换成a-k*b,然后当正常背包做。限制很奇怪的背包问题应该都可以这么做,前提是式子为线性的。

代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define maxx 105
#define eps 0.00000001
#define inf 0x7fffffff
#define mod 998244353
//#define int long long
int n,k;
int a[maxx],b[maxx];
int dp[maxx][5000]={0};
signed main() {
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)
        scanf("%d",&b[i]);
    for(int i=1;i<=n;i++)
        b[i]=a[i]-k*b[i];
    for(int i=0;i<=n;i++)
        for(int j=0;j<5000;j++)
            dp[i][j]=-inf;
    dp[0][2000]=0;
    for(int i=1;i<=n;i++){
        for(int j=-1000;j<=1000;j++)
            dp[i][j+2000]=max(dp[i-1][j+2000],dp[i-1][j-b[i]+2000]+a[i]);
    }
    if(dp[n][2000]==0)
        printf("-1\n");
    else
        printf("%d\n",dp[n][2000]);
    return 0;
}
//make a the value and b the weight
//sum of value should be k times of sum of weight
//a=kb
//make weight a-kb belongs to [-1000,100], add 1100 to them all.
View Code