zoukankan      html  css  js  c++  java
  • 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
    ");
    50         else printf("%d
    ",dp[10000]);
    51     }
    52     return 0;
    53 }
    View Code
  • 相关阅读:
    [题解]北京2018
    [数据结构][字典树]Word Puzzles
    [数据结构][字典树]Hardwood Species
    [数学][广义欧拉定理]上帝与集合的正确用法
    Equal Sums
    Useful Decomposition
    网络流 EK算法
    线段树各类操作
    唯一分解定理
    Kuro and Walking Route
  • 原文地址:https://www.cnblogs.com/fanminghui/p/3953181.html
Copyright © 2011-2022 走看看