C++代码实现:
//背包问题,输入最大载重量C,物体的重量,价值,并求出性价比
//按性价比从大到小排序,物体的数量
//输出运载的最大价值
#include "stdafx.h"
#include <iostream>
#include <algorithm>
using namespace std;
#define MAX 100
struct three
{
double w;//物体的重理
double v;//物体的价值
double p;//物体的性价比
}s[MAX];
bool cmp(three a, three b){
return a.p > b.p;//根据物体的性价比降序排列
}
int _tmain(int argc, _TCHAR* argv[])
{
int n;
double c;
cout << "输入物体的数量n及最大运载量c" << endl;
cin >> n >> c;
cout << "请依次输入物体的重量和价格,用空格隔开" << endl;
for (int i = 0; i < n; i++){
cin >> s[i].w >> s[i].v;
s[i].p = s[i].v / s[i].w;
}
sort(s, s + n, cmp);
double sum = 0.0;//总价值
for (int i = 0; i < n; i++){
if (s[i].w < c){//小于最大承重量
sum += s[i].v;
c -= s[i].w;
}
else{//大于最大承重量
sum += c*s[i].p;
break;
}
}
cout << "装入的最大价值为" << sum << endl;
return 0;
}
c代码实现:亮点在于传递结构体内的数组的用法,还有输出格式,一开始老是输出指数形式,用printf("%g",..)之后,自己转换过来了
//背包问题,输入最大载重量C,物体的重量,价值,并求出性价比
//按性价比从大到小排序,物体的数量
//输出运载的最大价值
#include "stdafx.h"
#include <stdlib.h>//准备调用快速排序库函数
#include <string>
#pragma warning(disable:4996)
#define MAX 100
struct three{
float w;//重量
float v;//价值
float p;//性价比
}s[MAX];
void bubbleStore(struct three a[], int n);
int _tmain(int argc, _TCHAR* argv[])
{
int n;
float c;
printf("请输入最大承重量C和物体的数量n\n");
scanf("%f%d", &c, &n);
printf("依次输入物体的重量和价值\n");
for (int i = 0; i < n; i++){
scanf("%f%f", &s[i].w, &s[i].v);
s[i].p = s[i].v / s[i].w;
//printf("%f", s[i].p);
}
printf("排序之前的序列为\n");
for (int i = 0; i < n; i++){
printf(" %.2f", s[i].p);
}
//自己写个冒泡排序的算法,按降序排列
bubbleStore(s, n);
//打印排列好后的序列
printf("排序之后的序列为\n");
for (int i = 0; i < n; i++){
printf(" %.2f", s[i].p);
}
float sun = 0.0;//总价值
for (int i = 0; i < n; i++){
if (s[i].w < c){
sun += s[i].v;
c -= s[i].w;
}
else{
sun += c*s[i].p;
break;
}
//printf("%f\n", sun);
}
printf("允许的最大价值为%.2f", sun);
return 0;
}
static void swap(struct three a[], int min, int n){
a[min].p = a[min].p + a[n].p;
a[n].p = a[min].p - a[n].p;
a[min].p = a[min].p - a[n].p;
}
//使用冒泡排序实现降序排列
void bubbleStore(struct three a[], int n){
for (int i = 0; i < n - 1; i++){
for (int j = 0; j < n - i; j++){
if (a[j].p < a[j + 1].p)swap(a, j, j + 1);
}
}
}
double 类型测试,在scanf中用的格式是%lf,而printf中可以用%f
// MyTest.cpp : 定义控制台应用程序的入口点。
//背包问题,输入最大载重量C,物体的重量,价值,并求出性价比
//按性价比从大到小排序,物体的数量
//输出运载的最大价值
#include "stdafx.h"
#include <stdlib.h>//准备调用快速排序库函数
#include <string>
#pragma warning(disable:4996)
#define MAX 100
struct three{
double w;//重量
double v;//价值
double p;//性价比
}s[MAX];
void bubbleStore(struct three a[], int n);
int _tmain(int argc, _TCHAR* argv[])
{
int n;
double c;
printf("请输入最大承重量C和物体的数量n\n");
scanf("%lf%d", &c, &n);
printf("依次输入物体的重量和价值\n");
for (int i = 0; i < n; i++){
scanf("%lf%lf", &s[i].w, &s[i].v);
s[i].p = s[i].v / s[i].w;
//printf("%f", s[i].p);
}
printf("排序之前的序列为\n");
for (int i = 0; i < n; i++){
printf(" %.2f", s[i].p);
}
//自己写个冒泡排序的算法,按降序排列
bubbleStore(s, n);
//打印排列好后的序列
printf("排序之后的序列为\n");
for (int i = 0; i < n; i++){
printf(" %.2f", s[i].p);
}
double sun = 0.0;//总价值
for (int i = 0; i < n; i++){
if (s[i].w < c){
sun += s[i].v;
c -= s[i].w;
}
else{
sun += c*s[i].p;
break;
}
//printf("%f\n", sun);
}
printf("允许的最大价值为%f", sun);
return 0;
}
static void swap(struct three a[], int min, int n){
a[min].p = a[min].p + a[n].p;
a[n].p = a[min].p - a[n].p;
a[min].p = a[min].p - a[n].p;
}
//使用冒泡排序实现降序排列
void bubbleStore(struct three a[], int n){
for (int i = 0; i < n - 1; i++){
for (int j = 0; j < n - i; j++){
if (a[j].p < a[j + 1].p)swap(a, j, j + 1);
}
}
}