栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

算法趣题-Q28

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

算法趣题-Q28

一、问题描述

二、问题分析

        一眼背包问题,那么就是使用动态规划可以比较好的解决,当然在这种数据量比较小的题目也可以暴力,并且也可以不用数组迭代直接递归,如C/C++实现。然而这体由于数据的分布过于离散,使用数组迭代也会有内存浪费,那么可以使用字典或者vector只记录有的数据,不去直接开辟所有空间,如Python实现。

三、代码实现 1.C/C++实现
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

typedef struct{
	int area, numbers;
}Club;

const int MAX_CLUB_NUM = 10;
const Club clubs[] = { {11000, 40}, {8000, 30}, {400, 24}, {800, 20}, {900, 14},
					   {1800, 16}, {1000, 15}, {7000, 40}, {100, 10}, {300, 12} };

int get_best(int remain, int index)
{
	if (index >= 10 or index < 0)
		return 0;
	if (remain < clubs[index].numbers)
		return 0;
	return max(get_best(remain - clubs[index].numbers, index + 1) + clubs[index].area, get_best(remain, index + 1));
}

int main()
{

	cout << get_best(150, 0) << endl;

	return 0;
}
2.Python实现
# coding = utf-8

CLUBS = [(11000, 40), (8000, 30), (400, 24), (800, 20), (900, 14),
         (1800, 16), (1000, 15), (7000, 40), (100, 10), (300, 12)]

iter_list = [(0, 150), ]

if __name__ == '__main__':
    max_area = 0

    for i in range(len(CLUBS)):
        tmp = []
        for item in iter_list:
            if item[1] >= CLUBS[i][1]:
                max_area = max(max_area, item[0] + CLUBS[i][0])
                tmp.append((item[0] + CLUBS[i][0], item[1] - CLUBS[i][1]))
        iter_list.extend(tmp)

    print(max_area)
    pass

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1018715.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号