笨笨猪 @ 2017-01-13 12:45:51
作为一名写C++的学生在做题时发现了题解中有一篇Pascal代码中使用了十分巧妙的位运算方法来给主件和附件分组,于是模仿着使用c++进行编写。
可是十分曲折,调试了很久提交了n次还是不过,很生气!
于是气急败坏的把pascal交了上去,ac了,然后把c++的.一模一样的代码(连变量名都一样!)交了上去,0分!!(毕竟连样例都过不了)
自己和同学加起来核对了十多遍,真心不知道为什么?
求大神解答!谢谢各位!【有图有真相】
#include<cstdio>
#include<algorithm>
using namespace std;
int i,j,k,m,n,x,t,ww,vv,w[100010],v[100010],a[1000][10],f[100010],cap;
bool boo[100010];
int main()
{
scanf("%d%d",&cap,&n);
for (i=1;i<=n;++i)
{
scanf("%d%d%d",&w[i],&v[i],&x);
v[i]=v[i]*w[i];
if (x==0) continue;
boo[i]=true;
++a[x][0];
a[x][a[x][0]]=i;
}
for (i=1;i<=n;++i)
if (!boo[i])
for (j=cap;j>=w[i];--j)
{
for (k=0;k<=(1<<a[i][0]-1);++k)
{
ww=0;
vv=0;
for (t=1;t<=a[i][0];++t)
if (((k>>(t-1))and 1)==1)
{
ww+=w[a[i][t]];
vv+=v[a[i][t]];
}
if (j>=ww+w[i]) f[j]=max(f[j],f[j-ww-w[i]]+vv+v[i]);
}
}
printf("%d\n",f[cap]);
return 0;
}
然后是题解中的Pascal代码
var
i,j,t,k,x,ww,vv,n,cap:longint;
w,v,f:array[0..100010] of longint;
a:array[0..1000,0..10] of longint;
boo:array[0..100010] of boolean;
function max(x,y:longint):longint;
begin
if x>y then exit(x);exit(y);
end;
begin
readln(cap,n);
for i:=1 to n do
begin
readln(w[i],v[i],x);
v[i]:=v[i]*w[i];
if x=0 then continue;
boo[i]:=true;
inc(a[x,0]);a[x,a[x,0]]:=i;
end;
for i:=1 to n do
if not boo[i] then
for j:=cap downto w[i] do
begin
for k:=0 to 1<<a[i,0]-1 do
begin
ww:=0;vv:=0;
for t:=1 to a[i,0] do
if (k>>(t-1))and 1=1 then
begin inc(ww,w[a[i,t]]);inc(vv,v[a[i,t]]);end;
if j>=ww+w[i] then f[j]:=max(f[j],f[j-ww-w[i]]+vv+v[i]);
end;
end;
writeln(f[cap]);
end.
求教了!
by 飞翔 @ 2017-01-13 13:23:14
@笨笨猪 我对C++的位运算不是很了解,我感觉是C++和Pascal同样的运算符表示的含义不同吧。既然对过10来遍我相信没什么大问题。
还有建议把++i全部改成i++试试(仅仅是建议,可能还是不行)
by lemonoil @ 2017-01-13 15:11:31
其实本来Pascal的运行速度是快与G++或GCC的,并且Pascal的默认与c++有区别
by stealthassassin @ 2017-01-13 17:18:43
c++里面没有and运算吧,请使用&,这个符号表示Pascal中的and
by stealthassassin @ 2017-01-13 17:29:25
哦,是因为for (k=0;k<=(1<<a[i][0]-1);++k)这句话的问题,c++中位运算的优先级很低,这样算的结果是1<<(a[i][0]-1)
by stealthassassin @ 2017-01-13 17:47:18
@ 笨笨猪
by 1124828077ccj @ 2017-01-13 21:43:30
@笨笨猪 有人叫你
by 笨笨猪 @ 2017-01-13 22:21:08
是的,谢谢各位,问题已经解决了。
@stealthassassin 谢谢你的帮助,是我太粗心了
也提醒大家要注意优先级的问题!谢谢各位帮助!
@飞翔
@lemonoil
@2016陈常杰
by 飞翔 @ 2017-01-16 13:24:15
果然坑那
by HT008 @ 2017-02-07 10:05:35
uc需要你
by burningdian @ 2017-02-28 17:52:02
继续努力,还和UC有点差距