cf C. Dima and Salad
http://codeforces.com/contest/366/problem/C
转化为背包问题,可以将a[i]-b[i]*k看成重量,a[i]为价值; 因为a[i]-b[i]*k可以为负数,所以应该分开讨论。结果就是dp[10000],如果等于0则输出-1,否则输出dp[10000];
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define maxn 500005 5 using namespace std; 6 7 int a[maxn],b[maxn]; 8 int w[maxn]; 9 int dp[maxn]; 10 int n,k; 11 12 int main() 13 { 14 while(scanf("%d%d",&n,&k)!=EOF) 15 { 16 for(int i=1; i<=n; i++) 17 { 18 scanf("%d",&a[i]); 19 } 20 for(int i=1; i<=n; i++) 21 { 22 scanf("%d",&b[i]); 23 } 24 for(int i=1; i<=n; i++) 25 { 26 w[i]=a[i]-b[i]*k; 27 } 28 memset(dp,-1,sizeof(dp)); 29 dp[10000]=0; 30 for(int i=1; i<=n; i++) 31 { 32 if(w[i]>=0) 33 { 34 for(int j=20000; j>=w[i]; j--) 35 { 36 if(dp[j-w[i]]!=-1) 37 dp[j]=max(dp[j],dp[j-w[i]]+a[i]); 38 } 39 } 40 else 41 { 42 for(int j=0; j<20000; j++) 43 { 44 if(dp[j-w[i]]!=-1) 45 dp[j]=max(dp[j],dp[j-w[i]]+a[i]); 46 } 47 } 48 } 49 if(dp[10000]==0) printf("-1\n"); 50 else printf("%d\n",dp[10000]); 51 } 52 return 0; 53 }