我不明白为什么我的for循环给出了一个尴尬的输出

问题描述 投票:-1回答:4

[不幸的是...昨天我问了关于另一个错误的确切问题,希望我不再有那些错误,但是我仍然有这个笨拙的输出,就像某种数字一样,取决于-4221565或- 4647963等...直到现在,我认为我的数组附加部分正常工作,我尝试过。但是我猜想条件中的-1出了点问题,但我无法命名。 For loop也是另一个我想说的地方。我正在尝试从凌晨3.00开始解决这个问题,然后拖延它,然后再尝试...截止日期为7.04.2020(TODAY)22.00,所以我开始变得疯狂。任何帮助将不胜感激。谢谢。所以这是一个问题(İnputs不必为15,最多可以为15):

您最多只能将15个不同的负载从一个端口运输到另一个端口。运送这些货物的货船的承载能力为50吨。枚举载荷,有关每个载荷重量的信息作为输入。

假设每个负载的重量小于或等于50吨且大于0。

您将在一行中从输入中读取每个负载的重量。您的输入将以-1结尾。您将打印必要的旅行次数。

样本输入:

50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 -1

输出:15

输入:20 25 25 36 37 25 20 10 50 9 16 45 32 10 25 -1

输出:11

输入:14 16 50 10 10 19 45 40 32 24 25 47 10 12 25 -1

输出:9

输入:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 -1

输出:3

这是我的代码:

#include <stdio.h>
int main()
{   int w,i,sum,index;
    int list[15];
    w = 1;
    index = 0;
    do
    {   scanf("%d",&w);
        list[index] = w;
        index++;
    }while(w != -1);
    sum = 0;
    for(i = 0;i < 15;i++)
    {
        sum +=list[i];
    }
        sum = sum / 50;
        printf("%d",sum);
    return 0;

}
c arrays for-loop logic knapsack-problem
4个回答
0
投票
在您的代码中,您正在传递数组-1的边界将是数组的第16个错误的元素。您至少需要int list[16];

但是我想说您的解决方案是错误的,您要根据给定的输入和输出判断负载以将其放置在货船中。例如,如果一艘船上有30个和10个,您可以将20个负载划分为两个10个负载,以便在船上放置最多50吨的货物。

您需要的是:

  1. 考虑一艘0吨的船
  2. 在负载总和小于或等于50时向其添加负载
  3. 如果添加了新负载,当前船只的总和将高于50 counter_ship++,然后将该负载添加到新负载中。

int main(void) { int w; int sum = 0; int ship_counter = 0; scanf("%d", &w); while (w != -1) { if (sum + w > 50) { ship_counter++; sum = 0; } sum += w; scanf("%d", &w); } if (sum != 50) ship_counter++; printf("%d", ship_counter); return 0; }


0
投票
像这样将do-while循环更改为一段时间:

while(w != -1 && index < 15) { scanf("%d",&w); list[index] = w; index++; }

这样可以避免写超出数组边界。

然后,for循环的条件可能是:

for(i = 0;i < index; i++)

(索引值来自上一个循环,仅取决于最后插入的下一个项目)。因此,您正在汇总实际具有输入的项目,而不是整个数组。

当然,如其他人所述,您可以不使用数组。

希望有所帮助


0
投票
这是我的任务版本:

#include <stdio.h> #define max_loads 5 int main() { int w[max_loads]; int cap; int trips; int i; int sum = 0; printf("Enter the weights of %d loads:\n",max_loads); for(int i = 0; i < max_loads; i++) { scanf("%d",&w[i]); sum = sum + w[i]; printf(" "); } printf("\n"); i = 0; do { sum = sum - w[i]; trips++; i++; } while (sum > 0); printf("The amount of needed trips are: %d", trips); return 0; }


do { scanf("%d",&w); list[index] = w; index++; } while(w != -1);

在最后一次迭代中,当您输入-1时,代码会将-1存储在list的第16个不存在的数组元素中-它写入超出数组界限的位置,这会调用未定义的行为。

您可以使用if语句在分配发生之前检查-1的值,然后如果break匹配则跳出循环。这样,您可以将do while(...)循环更改为while(1)循环。

您也可以省略第二个循环

for(i = 0;i < 15;i++) { sum +=list[i]; }

并在第一个中包含sum = sum + w;。这样,您甚至可以省略定义数组。结果是:

while(1) { scanf("%d",&w); if(w == -1) break; sum = sum + w; };

整个代码:

#include <stdio.h> int main() { int w,i,sum,index; w = 1; while(1) { scanf("%d",&w); if(w == -1) break; sum = sum + w; }; sum = sum / 50; printf("%d",sum); return 0; }


-1
投票
您需要对数组进行排序。然后,您需要检查阈值量。如果超过,则添加一个容器。

#include <stdio.h> void swap(int* xp, int* yp) { int temp = *xp; *xp = *yp; *yp = temp; } // Function to perform Selection Sort void selectionSort(int arr[], int n) { int i, j, min_idx; // One by one move boundary of unsorted subarray for (i = 0; i < n - 2; i++) { // Find the minimum element in unsorted array min_idx = i; for (j = i + 1; j < n-1; j++) if (arr[j] < arr[min_idx]) min_idx = j; // Swap the found minimum element // with the first element swap(&arr[min_idx], &arr[i]); } } int main() { int w,i,sum,index; int list[15]; w = 1; index = 0; do { scanf("%d",&w); list[index] = w; index++; }while(w != -1); selectionSort(list,index); for (int i = 0; i < index; i++) printf("%d ", list[i]); printf("\n"); int ans=0; int threshold=0; for(int i=0; i<index; ++i){ if(threshold + list[i]<=50){ threshold+=list[i]; } else { threshold = list[i]; ++ans; } } ans++; printf("%d", ans); return 0; }


-1
投票
您需要对数组进行排序。然后,您需要检查阈值量。如果超过,则添加一个容器。
© www.soinside.com 2019 - 2024. All rights reserved.