讨论 / why
sunwen 2011-08-07 02:30:00
点我顶贴 收藏 删除
#include<iostream>

using namespace std;

int main()

{

int i,j,n,opt[101]={0},l[21]={0},g[21]={0};

cin>>n;

for(i=0;i<n;i++)

cin>>l[i];

for(i=0;i<n;i++)

cin>>g[i];

for(i=0;i<n;i++)

for(j=100;j>l[i];j--)

if(opt[j-l[i]]+g[i]>opt[j])

opt[j]=opt[j-l[i]]+g[i];

cout<<opt[99];

return 0;

}

为什么只有90分

如果最后改为cout<<opt[100],就是一百分,why

#1 zhanglin@2011-08-05 15:10:00
回复 删除
回复 楼主sunwen 的帖子

这与你的循环有关,

你的内层循环是从100 downto l[i]+1,

表达的意思是用f[1]来更新,f[1]=0,

即,你假定它一定会从剩下1点健康的情况更新,

则你的状态也因此转移到了f[100]中(f[100]表示开始共100点健康能获得的最大快乐值),

如果你的内层循环是

for j:=99 downto l[i] do (sorry,我是pascal)

那么你就假定总健康值最大为99,(即把剩下的一点健康值预先留出来)

这种情况是从f[0]开始更新的,f[0]=0,

f[99]表达消耗99点健康值最多能得到的快乐值,

注意状态方程 的实际意义,会对你的dp解题有很大帮助。。。

#2 sunwenlongtan@2011-08-07 02:30:00
回复 删除
回复 沙发zhanglin 的帖子

查看更多回复
提交回复