C++代码实现:
//最优装载问题//输入物体的个数n及重量Wi,及能承受的最大装载重量C
//输出最多的装载数量
#include "stdafx.h"
#include <iostream>
#include <algorithm>//为了使用排序函数sort()从小到大排序
#define NUM 100
using namespace std;
double weight[NUM];
int _tmain(int argc, _TCHAR* argv[])
{
int n;//物体的数量
int c;//最大载重量
cout << "请输入物体的数量n" << endl;
cin >> n;
cout << "请输入船最大的载重量c" << endl;
cin >> c;
cout << "依次输入每个物品的重量: 用空格分开" << endl;
for (int i = 0; i < n; i++){
cin >> weight[i];//
}
sort(weight, weight + n);//从小到大排列
//运用贪心算法求解
int ans=0;//记录加载的个数
double weight_num = 0.0;//记录加载的重量
//开始时候想用while来实现,结果漏洞百出
//究其原因就是脱离了抽象出来的数据结构
for (int i = 0; i < n; i++){
weight_num += weight[i];
if (weight_num <= c)ans++;
else break;
}
cout << "可装载的最大数量为" << ans << endl;
return 0;
}
C代码实现:代码是写出来的,真心不是光有思路就可以的,期间遇到数组实参传递时int与double不相匹配的问题.
//最优装载问题//输入物体的个数n及重量Wi,及能承受的最大装载重量C
//输出最多的装载数量
#include "stdafx.h"
#include <stdio.h>
#pragma warning(disable:4996)
#define NUM 100
int weight[NUM];
static void SelectStor(int a[], int n);
void main(){
int n;
int c;
printf("请输入物体的个数n\n");
scanf("%d", &n);
printf("请输入最大的装载重量c\n");
scanf("%d", &c);
printf("依次输入n个物体的重量,用空格隔开\n");
for (int i = 0; i < n; i++){
scanf("%d", &weight[i]);
}
SelectStor(weight, n);
printf("输出排好序的序列为\n");
for (int i = 0; i < n; i++){
printf("%d", weight[i]);
printf("\n");
}
int weight_num = 0;//装载重量和
int ans=0;//装载数量
for (int i = 0; i < n; i++){
weight_num += weight[i];
if (weight_num < c)ans++;
else if (weight_num == c){ ans++; break; }
else break;
}
printf("装载的物件最大数量为%d\n", ans);
}
static void swap(int a[], int min, int n){
a[min] = a[min] + a[n];
a[n] = a[min] - a[n];
a[min] = a[min] - a[n];
}
//写个选择排序,使数组元素从小到大排序
static void SelectStor(int a[],int n){
for (int i = 0; i < n - 1; i++){
int min = i;
for (int j = i + 1; j < n ; j++){
if (a[min]>a[j])min = j;
}
if (min != i)swap(a, min, i);
}
}