zoj 4019 Schrödinger's Knapsack
Posted 啦啦啦天啦噜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了zoj 4019 Schrödinger's Knapsack相关的知识,希望对你有一定的参考价值。
题意:给你一个体积v,有两种物品,每个背包有一个权值,然找下面hint提示的算法,就可以得到这道题的题意
思路:很显然我们可以发现,在对物品进行排序后,我们才可以获得更多的权值,先贪心后,在开始动规,dp方程很容易得到dp[i][j]=max(dp[i-1][j]+cost,dp[i][j-1]+cost);(ps:都怪当时傻了,初始化写错了,不然过了)
代码:
#include <bits/stdc++.h> using namespace std; typedef long long LL; LL dp[2005][2005]; LL aa[2005],bb[2005]; LL pre1[2005],pre2[2005]; int main() { int T; scanf("%d",&T); while(T--){ int k1,k2,v; scanf("%d%d%d",&k1,&k2,&v); int n,m; scanf("%d%d",&n,&m); pre1[0]=0,pre2[0]=0; for(int i=1;i<=n;i++){ scanf("%lld",&aa[i]); } for(int i=1;i<=m;i++){ scanf("%lld",&bb[i]); } sort(aa+1,aa+1+n); sort(bb+1,bb+1+m); for(int i=1;i<=n;i++){ pre1[i]=pre1[i-1]+aa[i]; } for(int i=1;i<=m;i++){ pre2[i]=pre2[i-1]+bb[i]; } LL ans=0; for(int i=1; i<=n; i++){ if(pre1[i]<=v){ dp[i][0]=k1*(v-pre1[i])+dp[i-1][0]; ans=max(ans, dp[i][0]); } } for(int j=1; j<=m; j++){ if(pre2[j]<=v){ dp[0][j]=k2*(v-pre2[j])+dp[0][j-1]; ans=max(ans, dp[0][j]); } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ LL as=v-pre1[i]-pre2[j]; if(as>=0){ dp[i][j]=max(dp[i-1][j]+k1*as,dp[i][j-1]+k2*as); ans=max(ans,dp[i][j]); } } } printf("%lld\n",ans); } return 0; } /* 3 3 2 7 2 3 4 3 1 3 2 1 2 10 3 4 2 1 2 3 2 3 1 1 2 5 1 1 2 1 1 3 2 3 2 3 4 3 1 3 2 */
以上是关于zoj 4019 Schrödinger's Knapsack的主要内容,如果未能解决你的问题,请参考以下文章
错误 MSB4019 - MSBUILD 正在寻找不存在版本的导入
npm install -g karma error MSB4019: 未找到导入的项目“C:\Microsoft.Cpp.Default.props”