题意:
给出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;
}

京公网安备 11010502036488号