算法第一次作业(2.帐篷问题)

题目:
某公司团建郊游,男女生一共有T个人,其中X个为男生, Y个为女生,再其中,有v对异性情侣,到宿营地后,开始分配帐篷。
帐蓬有三种,三人帐篷,普通双人帐篷和爱心帐篷。
注意,普通帐篷双人和三人帐蓬都只能住相同性别的人,而爱心帐篷可以住一对异性情侣。但是,普通帐篷和三人帐篷的实际入住人数量可以小于其上限,而爱心帐篷则不行。
帐蓬价格:三人帐篷p1元/顶,普通双人帐蓬p2元/顶,爱心帐篷p3元/顶

要求总价最少即可。注:三人帐篷不一定比两人帐篷便宜。情侣可以拆开睡。

#include<iostream>
#include<vector>
using namespace std;

int main()
{
    int p1, p2, p3;
    int x, y, v;
    cout << "输入男生人数:";
    cin >> x;
    cout << "输入女生人数:";
    cin >> y;
    cout << "输入情侣人数:";
    cin >> v;
    cout << "输入三人帐篷的单价:";
    cin >> p1;
    cout << "输入普通两人帐篷的单价:";
    cin >> p2;
    cout << "输入爱心帐篷的单价:";
    cin >> p3;
    //定义两个数组分别存男生的方案和女生的方案
    int arr1[100][3], arr2[100][3];
    int cnt1 = 0, cnt2 = 0;
    int men = x, women = y;


    //根据情侣的数量来枚举所有的情况 
    for (int i = 0; i <= v; i++)
    {
        //减去混合的男女方便分类
        //每次要重新赋值,在循环中x y 数量会变
        x = men;
        y = women;
        //减去情侣的数量
        x -= i;
        y -= i;

        //男生三人帐篷
        int m1, m2;
        //考虑取余的情况,住不满
        if (x % 3 == 0) m1 = x / 3; else m1 = x / 3 + 1;
        //同样的问题 ,每次数量都会变
        int tmp = x;
        //枚举双人帐篷的数量
        for (int j = 0; j <= m1; j++)
        {
            x = tmp;
            //减去住三人帐篷的人
            x -= j * 3;
            //剩下的都是猪双人帐篷的,同样考虑住不满取余的情况
            if (x % 2 == 0) m2 = x / 2; else m2 = x / 2 + 1;
            //如果男的数量在减去三人帐篷的数量乘3的小于0的话,说明存在三人帐篷住不满的情况,这样就没有人住双人帐篷了
            if (x < 0) m2 = 0;
            //将结果存在数组里面
            arr1[cnt1][0] = j; arr1[cnt1][1] = m2; arr1[cnt1][2] = i;
            cnt1++;
        }

        //女生同理
        int w1, w2;
        if (y % 3 == 0) w1 = y / 3; else w1 = y / 3 + 1;
        tmp = y;
        for (int j = 0; j <= w1; j++)
        {
            y = tmp;
            y -= j * 3;
            if (y % 2 == 0) w2 = y / 2; else w2 = y / 2 + 1;
            if (y < 0) w2 = 0;
            arr2[cnt2][0] = j; arr2[cnt2][1] = w2; arr2[cnt2][2] = i;
            cnt2++;
        }
    }

    int price = 1000000, a=0, b=0, c=0;
    //加入 能让男生住满的方案m种, 女生n种,总的条件一个有 m * n种 
    for (int i = 0; i < cnt1; i++)
    {
        for (int j = 0; j < cnt2; j++)
        {
            //但是应该注意一个条件 男女生两种方案中的情侣帐篷数量应该相等 才符合要求
            if (arr1[i][2] == arr2[j][2])
            {
                int temp = (arr1[i][0] + arr2[j][0]) * p1 + (arr1[i][1] + arr2[j][1]) * p2 + arr1[i][2] * p3;
                // 打印出所有的搭配
                // cout << "三人:" << arr1[i][0] + arr2[j][0] << " 双人:" << arr1[i][1] + arr2[j][1] << " 爱心:" << arr1[i][2]<<  " 价格:" << temp << endl;;
                //每次都和之前的价格比较
                // price = min(price, temp);
                if (temp < price)
                {
                    price = temp;
                    a = arr1[i][0] + arr2[j][0]; b = arr1[i][1] + arr2[j][1]; c = arr1[i][2];
                }
            }
        }
    }
    cout << "三人:" << a << " 双人:" << b << " 爱心:" << c << " 价格:" << price << endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值