贪心解法-----c语言

你一定听过田忌赛马的故事吧?
如果3匹马变成1000匹,齐王仍然让他的马按从优到劣的顺序出赛,田忌可以按任意顺序选择他的赛马出赛。赢一局,田忌可以得到200两银子,输一局,田忌就要输掉200两银子,平局的话不输不赢。 请问田忌最多能赢多少银子?

关于输入:
输入包含多组测试数据,每组测试数据的第一行是一个整数n(1<=n<=1000),表示田忌和齐王都拥有n匹马。接下来一行是n个整数,表示田忌的马的速度,下一行也是n个整数,表示齐王的马的速度。 输入的最后以一个0表示结束。

关于输出:

对每组数据,输出一个整数,表示田忌至多可以赢多少银子,如果田忌赢不了,就输出一个负数,表示田忌最少要输多少银子。

 

//
// main.m
// tanxin
//
// Created by zhangmingwei on 13-1-11.
// Copyright (c) 2013年 zhangmingwei. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

@autoreleasepool {
//求a中有多少比b中好的。如果a好于b则a加1分,相等分数为0 ,坏于b则减1分。因为如果相等的话,为了分数更多,也应该让这次分数为0
int b[10]={1,3,4,5,7,8,9,34,56,77};
int a[10]={2,2,6,7,7,9,11,22,44,56};

// int b[4]={4,7,9,12};
// int a[4]={3,6,8,9};
int m=0;//a的分数
int j=0;
int count1,count2;
count1=count2=10;
for (int i=0; i<count1;) {
if (a[i]>b[j]) {
m++;
i++;
j++;
}
else if (a[count1-1]>b[count2-1]) {
m++;
count1--;
count2--;
}

else{
m--;
i++;
count2--;
}
}

NSLog(@"a的得分为====%d",m);
}
return 0;
}

背包问题是一类经典的优化问题,贪心算法是其中的一种解法。 具体来说,假设有一个背包,它的总容量为W,现在有n个物品,每个物品有一个重量wi和一个价值vi。要求选出一些物品放入背包中,使得它们的总重量不超过W,且它们的总价值最大。 贪心算法的思路是,按照每个物品的单位价值(即vi/wi)从大到小排序,然后依次将单位价值高的物品放入背包中,直到背包无法再放下下一个物品为止。 下面是C语言实现: ```c #include <stdio.h> #include <stdlib.h> typedef struct { int weight; // 物品重量 int value; // 物品价值 } Item; int cmp(const void *a, const void *b) { Item *ia = (Item *)a; Item *ib = (Item *)b; return (ib->value / ib->weight) - (ia->value / ia->weight); } int knapsack(Item *items, int n, int W) { qsort(items, n, sizeof(Item), cmp); // 按单位价值排序 int cur_weight = 0; // 当前背包重量 int cur_value = 0; // 当前背包价值 for (int i = 0; i < n; i++) { if (cur_weight + items[i].weight <= W) { // 如果可以放下当前物品 cur_weight += items[i].weight; cur_value += items[i].value; } else { // 否则只放入能容纳的部分 int remain = W - cur_weight; cur_value += items[i].value * ((double)remain / items[i].weight); break; } } return cur_value; } int main() { Item items[] = {{2, 10}, {3, 15}, {5, 20}, {7, 25}, {9, 30}}; int n = sizeof(items) / sizeof(Item); int W = 15; int max_value = knapsack(items, n, W); printf("Max value: %d\n", max_value); // 输出最大价值 return 0; } ``` 以上代码中,我们定义了一个Item结构体,表示每个物品的重量和价值;cmp函数用来按单位价值排序;knapsack函数是核心函数,它依次考虑每个物品,如果能放下就全部放入,否则只放入能容纳的部分。最后返回背包内物品的总价值。 在主函数中,我们定义了一个包含5个物品的数组和背包容量W=15,然后调用knapsack函数求解最大价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值