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