题意给你两个集合a,b,然后一个k,一个集合中的几个数相加,除以另一个集合的几个数相加,等于k,问最多第一个集合中的数能使多少
数据范围集合中的数个数是1e5
思路先给他移项,移动之后就会发现这是一个容量是0的背包,由于容量是0,可能有负数,所以要向正方向去平移
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 1e5;
int dp[110][N * 2 + 10];
int a[110] , b[110] , v[110];
int main()
{
int n , k;
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++) v[i] = a[i] - k * b[i];
for(int i = 0 ; i <= N * 2 + 10 ; i++) dp[0][i] = -(1 << 30);
dp[0][N] = 0;
for(int i = 1 ; i <= n ; i++){
for(int j = 2 * N ; j >= 0 ; j--){
dp[i][j] = max(dp[i - 1][j] , dp[i - 1][j - v[i]] + a[i]);
}
}
if(dp[n][N] == 0) printf("-1\n");
else printf("%d\n",dp[n][N]);
return 0;
}