如何通过在阵列中一次取两件物品来增加重量?

问题描述 投票:0回答:1

找到袋子里的总重量,这样每次我们只需要从阵列中挑选2件物品然后再添加到袋子里。

输入:

int n = 5;
int w = {1 3 7 5 6};
  • 重量为1和3的项目添加→4(A)。
  • 然后添加A和重量为5的项目→9(B)。
  • 在具有权重6和7的项目之后添加→13(C)。
  • 最后B和C添加→22
  • totalweight=4(A)+9(B)+13(C)+22

MyLogic:

int totalweight(int n, int w[]){
   int x = w[0] + w[1];
   int t = x;
   int sum = 0;
   for (int i = 2; i < n; i++)
   {
    sum = sum + t;
    t = w[i] + t;
   }

  return sum;
 }

我的输出:

31

预期产出:

48

我随后补充说。我该如何解决?

c arrays weight
1个回答
1
投票

在重新阅读您的评论后,我相信这更像是一个算法问题。如果是这样,我建议使用链表数据结构方法。想象一下你的数组作为一个链表,

1->3->5->6->7

我对它进行了分类主要是因为你的目标是找到可能的最小总数。然后继续执行下面的算法,直到链接列表中只剩下一个元素。

  1. 添加链接列表中的前两个元素
  2. 从链接列表中删除前两个元素,但跟踪此本地总和
  3. 将该局部和加到全局和变量中
  4. 将本地总和存储在链表中,同时保持列表排序
  5. 重复,直到链表中只剩下一个元素

以下是此算法每次迭代后列表的示例,

1->3->5->6->7, sum = 0
4->5->6->7, sum = 0 + 4 = 4
6->7->9, sum = 4 + 9 = 13
9->13, sum = 13 + 13 = 26
22, sum = 26 + 22 = 48

我将把编码留给你,因为它可以完全参与编码链表和一个函数,以便在每次添加元素时对其进行排序。但是,为了让您开始这里是一个如何将元素添加到链表的示例,

struct Node 
{ 
    int data; 
    struct Node *next; 
};

void addToTheEnd(Node** head, int value) {
    //adds an element to the end of a linked list
    if(*head == NULL) {
        *head = (struct Node*) malloc(sizeof(struct Node));
        (*head)->data = value;
        (*head)->next = NULL;
    }
    else {
        struct Node* current = *head;
        while(current->next != NULL) {
            current = current->next;
        }
        current->next = (struct Node*) malloc(sizeof(struct Node));
        current->next->data = value;
        current->next->next = NULL;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.