代码如下
#include<bits/stdc++.h>
using namespace std;
const int inf=0x7fffffff;
int n,k;
int a[105],b[105];
int c[105];
int dp1[10005],dp2[10005];//dp1维护正的c,dp2维护负的c
int 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<=1e4;i++){
dp1[i]=dp2[i]=-inf;
}//初始化
dp1[0]=0;dp2[0]=0;//初始化边界
for(int i=1;i<=n;i++){
c[i]=a[i]-k*b[i];
if(c[i]>=0){
for(int j=1e4;j>=c[i];j--){
dp1[j]=max(dp1[j],dp1[j-c[i]]+a[i]);
}
}//c[i]为正数(或0
else{
for(int j=1e4;j>=-c[i];j--){
dp2[j]=max(dp2[j],dp2[j-(-1*c[i])]+a[i]);
}
}
}//c[i]为负数
int ans=0;
for(int i=0;i<=1e4;i++){
if(dp1[i]==-inf||dp2[i]==-inf){
continue;
}
else{
ans=max(ans,dp1[i]+dp2[i]);
}
}//f[i]+g[i]保证c之和为0,统计答案最大值
if(!ans)cout<<-1;
else cout<<ans;
return 0;
}
调了几遍感觉没有什么问题,但是WA了。。。
样例如下:
输入
3 2
10 8 1
2 7 1
正确输出
3 2
10 8 1
2 7 1
输入2
5 3
4 4 4 4 4
2 2 2 2 2
正确输出:
-1
求dalao们指点