如下代码(不用看):
#include <iostream>
using namespace std;
#define ll long long
ll n,c,a[35],sum[35],ans;
//void dfs(ll now,ll x){
//
cout<<"x="<<x<<endl;
// if(sum[now]+x<=c){
// ans=max(sum[now]+x,ans);
// return;
// }
cout<<"ans="<<ans<<endl;
// ans=max(ans,x);
//
for(int i=1;i<=now;i++){
if(x+a[i]<=c){
dfs(i-1,x+a[i]);
}
}
//
//
// for(int i=now;i;i--){
// if(x+a[i]<=c){
// dfs(i-1,x+a[i]);
// }
// }
//}
int main()
{
// printf("%lld\n",ans); ans=0
scanf("%lld%lld",&n,&c);
// printf("%lld\n",ans); ans=0
for(int i=1;i<=n;i++){
// printf("i=%d,ans=%lld\n",i,ans); ans=0
scanf("%lld",&a[i]);
// if(i==35) printf("i=%d,ans=%lld\n",i,ans); ans=0
// if(a[i]>c){
// n=i-1;
// break;
// }
sum[i]=a[i]+sum[i-1];
// if(i==35) printf("i=%d,ans=%lld\n",i,ans); ans=1517643316
}
// printf("sum[n]=%lld\n",sum[n]);
// printf("%lld\n",ans);
// ans=max(ans,0LL);
// printf("%lld\n",ans);
//
// ans=0;
// printf("%lld\n",ans);
// dfs(n,0LL);
printf("%lld",ans);
return 0;
}
代码很长,不过不用都看,跟标题无关,都被我注释掉了
问题代码只有以下部分(这个可以看)
#include <iostream>
using namespace std;
#define ll long long
ll n,c,a[35],sum[35],ans;
int main()
{
// printf("%lld\n",ans); ans=0
scanf("%lld%lld",&n,&c);
// printf("%lld\n",ans); ans=0
for(int i=1;i<=n;i++){
// printf("i=%d,ans=%lld\n",i,ans); ans=0
scanf("%lld",&a[i]);
// if(i==35) printf("i=%d,ans=%lld\n",i,ans); ans=0
sum[i]=a[i]+sum[i-1];
// if(i==35) printf("i=%d,ans=%lld\n",i,ans); ans=1517643316
}
printf("%lld",ans);
return 0;
}
运行截图:
显然这个ans是在第35次循环时,求前缀和的时候
sum[35]=a[35]+sum[34];//就是这一步
发生的,ans从0变成了1517643316。。。
首先这个情况跟long long没关系,因为我改成int后结果并没有发生变化。。
具体原因我也搞不清楚,可能跟地址分配有关?
傻啊,sum数组越界了,你只开了35,你咋给35赋值嘛?
sum[35]被挤出来了,挤给ans了,具体怎么成为1517643316的我也不知道,不过跟sum数组的最后一个数与越界数相加的值听接近的。。
不过给以后也提了个醒,尽可能在使用某变量的时候检查一下初值,初值不为0就考虑数组越界,本该属于数组的值跑到你ans里面来了