zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    python学习之路01
    面向对象(2)__继承多态1
    面向对象(1)____私有公有 访问限制
    property
    yield理解
    列表推导式
    Django序列化1_基本的序列化和反序列化
    一些滑动操作
    装饰器
    django模板
  • 原文地址:https://www.cnblogs.com/au-xiaotian/p/3441512.html
Copyright © 2011-2022 走看看