codeforces 366C

来源:互联网 发布:仓库拣货路线优化 编辑:程序博客网 时间:2024/05/19 13:29

题意:给出n,k  然后给出n个水果对应的taste和calories  要求选出一些水果 满足          ,在满足这个的情况下求的最大值、


思路:令bi=ai-k×bi,就是sigma(b[i])=0,sigma(a[i])最大。

把b[i]当体积,a[i]当价值,这样就形成了一个01背包、

然后设置一个偏移量就好、

#include<cmath>#include<cstring>#include<cstdio>#include<algorithm>#include<queue>#include<map>using namespace std;const int maxn = 50000;int n,m,k;int dp[maxn<<2];int a[111],b[111]; int main(){int n,k;scanf("%d%d",&n,&k);for(int i=0; i<n; ++i)scanf("%d", a+i);for(int i=0; i<n; ++i){scanf("%d", b+i);b[i] = a[i]-k*b[i];}memset(dp, -1, sizeof(dp));dp[maxn/2] = 0;for(int i=0; i<n; ++i){if(b[i]>=0){for(int j=maxn; j>=b[i]; --j)if(~dp[j-b[i]])dp[j] = max(dp[j], dp[j-b[i]]+a[i]);}else{for(int j=0; j<=maxn+b[i]; ++j)if(~dp[j-b[i]])dp[j] = max(dp[j], dp[j-b[i]]+a[i]);}}int ans = dp[maxn/2];if(ans==0)ans = -1;printf("%d\n", ans);}


和这题类似的还有poj的2184


0 0
原创粉丝点击