C程序给出了包含浮动rand()调用的不同答案

van*_*run 2 c debugging

当我编写这段代码时,我试图解决竞争性编程问题:

#include<stdio.h>
#include <stdlib.h>

int brr[100];
int n,arr[100];
int s[100];

int dyn(int num){    
    int i,ans;
    if(brr[num]!=-1){
      return brr[num];}

    for(i=0;i<n;i++){
      if(arr[i]==num){
        ans=1;
        s[num]=arr[i];
        break;}
      else if(arr[i]<num){
        if(i==0){
          ans=1+dyn(num-arr[i]);
          s[num]=arr[i];}
        else {
          if(ans>1+dyn(num-arr[i])){
            ans=1+dyn(num-arr[i]);
            s[num]=arr[i];
          }}}}
  brr[num]=ans;
   return ans ;
}    

int main(){
  scanf("%d",&n);
  int i;
  for(i=0;i<n;i++){
    scanf(" %d",&arr[i]);
  }
  int num=0;
  scanf(" %d",&num);
  for(i=0;i<=num;i++){
    brr[i]=-1;}
  brr[0]=0;
  for(i=1;i<=num;i++){
    dyn(i);
    //rand();
  }
  printf("\n%d\n",dyn(num));
  while(num>0){
    printf("\t%d",s[num]);
    num=num-1;
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

第44行有一个注释掉的rand().如果我执行带有rand()注释掉的代码,我会得到结果为

2
6    6    6    6    6    5    0    0    2    1
Run Code Online (Sandbox Code Playgroud)

输入4 6 5 2 1 10

删除评论后,我得到

2
5    6    6    6    6    5    2    2    2    1
Run Code Online (Sandbox Code Playgroud)

对于相同的输入.

这是怎么回事?

Mar*_*ian 7

dyn在行中的功能

if(ans>1+dyn(num-arr[i])){
Run Code Online (Sandbox Code Playgroud)

该值ans可以未初始化使用.这导致程序的行为未定义.