cf #214 Dima and Salad
题目:
分析:将b[i]*k,那么就可以得到,Σ(a[i]-b[i])=0,为了使Σa[i]最大化,可以将之转化为一个容量为0的背包问题,dp解决,dp[i][j]表示放第i件物品时容量为j时的最大值;
代码:
#include<iostream> #include<algorithm> #include<cmath> #include<stdlib.h> #include<stdio.h> #include<string.h> #include<queue> #define DEBUG //todo using namespace std; int nn; int n,k,a[110],b[110],rem[110],con[110],dp[110][20010],ans; void ini() { ans=-1; cin>>n>>k; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) cin>>b[i]; } void work() { for(int i=1;i<=n;i++) b[i]*=k; for(int i=1;i<=n;i++) rem[i]=a[i]-b[i]; //dp[1][10000+rem[1]]=a[1]; //memset(dp,-1,sizeof(dp)); for(int i=0;i<110;i++) for(int j=0;j<=20000;j++) dp[i][j]=-1000000000; dp[0][10000]=0; for(int i=1;i<=n;i++) { for(int j=0;j<=20000;j++) { if(j-rem[i]>=0 && j-rem[i]<=20000) dp[i][j]=max(dp[i-1][j],dp[i-1][j-rem[i]]+a[i]); } } if(dp[n][10000]==0) {cout<<"-1"<<endl; return;} else cout<<dp[n][10000]<<endl; } int main() { ini(); work(); #ifdef DEBUG cin>>nn; #endif return 0; }