首页 > 代码库 > POJ 2184 Cow Exhibition
POJ 2184 Cow Exhibition
这题有两个费用,一个是聪明度s,另一个是幽默度f。
可以把其中一个当做体积,另一个当做价值,因为有负数的原因,当做体积的那一个加上1000
dp[i]用来表示体积为i 的最大价值
自己在敲的时候,更新的时候出了问题
1 for(j=mmax; j>=a; j--) 2 if(dp[j-a]!=-inf) 3 { 4 int n1=cnt[j],n2=cnt[j-a]; 5 if(dp[j]+j-n1*1000<dp[j-a]+j-a-n2*1000+b) 6 { 7 dp[j]=dp[j-a]+b; 8 cnt[j]=cnt[j-a]+1; 9 }10 11 }
红色部分是错误的,红色部分表示的是聪明度为i时,聪明度+幽默度的和最大,但是dp[i]用来表示体积为i 的最大价值,dp[j]用来表示体积为j 的最大价值,所以不可以把j,j-a放进去。
正确的更新应该是
1 for(j=mmax; j>=a; j--) 2 if(dp[j-a]!=-inf) 3 { 4 int n1=cnt[j],n2=cnt[j-a]+1; 5 if(dp[j]-n1*1000<dp[j-a]-n2*1000+b) 6 { 7 dp[j]=dp[j-a]+b; 8 cnt[j]=cnt[j-a]+1; 9 }10 11 }
还有一个容易出现问题的地方
1 for(i=0; i<=mmax; i++)2 if(dp[i]>=0&&i-cnt[i]*1000>=0)//聪明度和幽默度都不能为负数3 {4 int tmp=i+dp[i];5 int nm=cnt[i];6 tmp-=1000*nm;7 mm=max(mm,tmp);8 }
绿色的条件不能弄错了
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<set> 6 #include<vector> 7 #include<map> 8 #include<algorithm> 9 #include<cmath>10 #include<stdlib.h>11 using namespace std;12 const int inf = 100000000;13 int dp[210000],cnt[210000];14 int main()15 {16 int i,j,n;17 while(cin>>n)18 {19 for(i=0; i<=200000; i++)20 dp[i]=-inf;21 dp[0]=0;22 memset(cnt,0,sizeof(cnt));23 int mmax=0;24 for(i=1; i<=n; i++)25 {26 int a,b;27 scanf("%d%d",&a,&b);28 a+=1000;29 mmax+=a;30 for(j=mmax; j>=a; j--)31 if(dp[j-a]!=-inf)32 {33 int n1=cnt[j],n2=cnt[j-a]+1;34 if(dp[j]-n1*1000<dp[j-a]-n2*1000+b)35 {36 dp[j]=dp[j-a]+b;37 cnt[j]=cnt[j-a]+1;38 }39 40 }41 }42 int mm=0;43 for(i=0; i<=mmax; i++)44 if(dp[i]>=0&&i-cnt[i]*1000>=0)45 {46 int tmp=i+dp[i];47 int nm=cnt[i];48 tmp-=1000*nm;49 mm=max(mm,tmp);50 }51 52 cout<<mm<<endl;53 }54 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。