最优装载问题代码实现

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);
	}
}

 

    原文作者:分支限界法
    原文地址: https://blog.csdn.net/guangod/article/details/81778562
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞