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;
}

 

 

posted on 2013-11-25 14:52  uestc小田  阅读(219)  评论(0编辑  收藏  举报

导航