讨论 / 这题是用DP吧?但是我用的背包怎么有超时?大牛们讲下~~有更好办法吗?
3508855 2008-11-13 20:19:00
点我顶贴 收藏 删除
program fafd;

var

f:array[0..36001] of boolean;

m,n,i,j,x:integer;

begin

readln(m,n);

fillchar(f,sizeof(f),false);

f[0]:=true;

for i:=1 to n do begin

read(x);

for j:=m downto x do

if f[j-x] then f[j]:=true;

end;

for i:=m downto 1 do

if f[i] then begin

writeln(i);

halt;

end;

end.

#1 lychees@2008-05-28 03:41:00
回复 删除
普通的0/1背包哟= -

不需要开布尔变量的...

只是价值和重量一样而已~

#2 kingoffighters@2008-10-22 02:07:00
回复 删除
好像没有了,我用背包,WA了3组……
#3 LIFE@2008-10-22 04:32:00
回复 删除
大哥卡路里是LONGINT的范围!!INTEGER怎么可能对。
#4 飞雪天涯@2008-10-22 07:01:00
回复 删除

装箱就是了,还麻烦用背包

#5 飞雪天涯@2008-10-22 07:01:00
回复 删除
#define MAXT 35000

#define MAXN 21

#include<iostream>

using namespace std;

int T,N,dp[MAXT+1],t[MAXN+1],v[MAXN+1];

int main (void)

{

cin>>T>>N;

for (int i=1;i<=N;i++)

cin>>t[i],v[i]=t[i];

for (int j=1;j<=N;j++)

for (int i=T;i>=t[j];i--)

if (dp[i-t[j]]+v[j]>dp[i])

dp[i]=dp[i-t[j]]+v[j];

cout<<dp[T];

return 0;

}

#6 lzpsmith@2008-11-13 06:59:00
回复 删除
dfs+弱智剪枝可过,
#7 飞雪天涯@2008-11-13 20:19:00
回复 删除
……O__O"暴汗!
查看更多回复
提交回复