您的位置:首页 > 其它

Codeforces 366C Dima and Salad

2016-06-28 11:50 471 查看
http://codeforces.com/problemset/problem/366/C

题意:在一个冰箱里有n种水果,并且这些水果每一种都有一个美味度和一个卡路里的属性, 小明要从这些水果中选出来一些做一个水果沙拉, 并且要求他的水果沙拉的美味度之和是卡路里和的k倍,问小明是否可以做出这么一个水果沙拉,若不能输出-1,否则输出符合要求的最大的美味值之和。

思路:考虑这样DP:f[i][j]:做到第i个水果,平衡度为j,平衡度的表示:Σa[i]-K*Σb[i],这样就可以dp

f[i][j]=max(f[i-1][j],f[i-1][j-a[i]+K*b[i]])

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<iostream>
int f[105][100005],a[1005],b[1005],g[1005][1005];
int n,K;
int read(){
int t=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while ('0'<=ch&&ch<='9'){t=t*10+ch-'0';ch=getchar();}
return t*f;
}
int main(){
n=read();K=read();
for (int i=1;i<=n;i++) a[i]=read();
for (int i=1;i<=n;i++) b[i]=read();
for (int i=0;i<=n;i++)
for (int j=0;j<=500000;j++)
f[i][j]=-99999999;
f[0][20000]=0;  int cnt=0;
for (int i=1;i<=n;i++){
cnt++;
for (int j=-10000;j<=10000;j++){
f[i][j+20000]=std::max(f[i][j+20000],std::max(f[i-1][j+20000],f[i-1][j-a[i]+K*b[i]+20000]+a[i]));
}
}
int ans=-1;
if (f
[20000]) ans=f
[20000];
printf("%d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: