题意:n件物品,每件物品有a,b两个属性,最终在A属性的和是B属性和的K倍的前提下,A最大为多少
设c[i]=a[i]-k*b[i],这样A属性的和是B属性和的K倍就变成c[i]的和为0。使c[i]为花费,A为价值的01背包。因为c[i]有正有负,所以需要用两个数组。
#include <bits/stdc++.h>
using namespace std;
const int maxn=105;
int n,k,a[maxn],b[maxn],c[maxn],dp[10005],f[10006];
int main()
{
scanf("%d %d",&n,&k);
int i,j;
memset(f,-0x3f,sizeof(f));
memset(dp,-0x3f,sizeof(dp));
f[0]=dp[0]=0;
for(i=0; i<n; i++)
scanf("%d",&a[i]);
for(i=0; i<n; i++)
{
scanf("%d",&b[i]);
c[i]=a[i]-k*b[i];
// printf("%d\n",c[i]);
}
for(i=0; i<n; i++)
{
if(c[i]>=0)
{
for(j=10000; j>=c[i]; j--)
{
f[j]=max(f[j],f[j-c[i]]+a[i]);
}
}
}
for(i=0; i<n; i++)
{
if(c[i]<0);
{
c[i]=-c[i];
for(j=10000; j>=c[i]; j--)
{
dp[j]=max(dp[j],dp[j-c[i]]+a[i]);
}
}
}
int ans=-1;
for(j=0; j<=10000; j++)
{
if(dp[j]==0&&f[j]==0)
continue;
else
ans=max(ans,dp[j]+f[j]);
}
printf("%d\n",ans);
return 0;
}