设有n个程序(1,2,…,n}要存放在长度为L的磁带上。程序i存放在磁带上的长度键盘输入。
程序存储问题要求确定这n个程序在磁带上的一个存储方案,使得能够在磁带上存储尽可能多的程序。对于给定的n个程序存放在磁带上的长度,编程计算磁带上最多可以存储的程序数。
#include<stdio.h>
#include<stdlib.h>
int cmp(const void *a, const void *b){
return (*(int *)a - (*(int *)b));
}
void arange(int n, int array1[], int L){
int count = 0; // 标记存入几个程序
for(int i = n - 1; i >= 0; i--){
if(L >= array1[i]) count++; // 使用小于等于的条件判断
L -= array1[i];
}
printf("%d", count);
}
int main(){
int n = 0, L = 0;
scanf("%d %d", &n, &L);
int array[n];
for(int i = 0; i < n; i++){
scanf("%d", &array[i]);
}
qsort(array, n, sizeof(int), cmp); // 使用qsort对array进行从小到大排序
arange(n, array, L);
return 0;
}
#include<stdio.h>
#include<stdlib.h>
int cmp(const void *a, const void *b){
return (*(int *)a - (*(int *)b));
}
void arange(int n, int array1[], int L){
int count = 0; // 标记存入几个程序
int *ptr = array1 + n - 1; // 指向数组最后一个元素
while (ptr >= array1 && L > 0) {
if (*ptr <= L) { // 如果当前程序长度小于等于剩余空间
count++; // 存入当前程序
L -= *ptr; // 更新剩余空间
}
ptr--; // 移动指针到下一个程序
}
printf("%d", count);
}
int main(){
int n = 0, L = 0;
scanf("%d %d", &n, &L);
int array[n];
for(int i = 0; i < n; i++){
scanf("%d", &array[i]);
}
qsort(array, n, sizeof(int), cmp); // 使用qsort对array进行从小到大排序
arange(n, array, L);
return 0;
}
为什么第一个代码错误第二个代码正确,我猜是存储的问题,但是我不理解这些常量和数组在内存中是如何存放和读取调用的,求解答。