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
21518
回复
删除
回复 楼主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解题有很大帮助。。。