第一周 项目2 胖子伤不起

本文介绍了一个用于评估体重状态的程序,通过输入个人的基本信息,如姓名、性别、身高和体重,程序会计算并输出相应的体重状态,帮助用户了解自己的体重是否处于健康范围内。

我的程序:


01./*  
02.* 程序的版权和版本声明部分:  
03.* Copyright (c) 2013, 烟台大学计算机学院  
04.* All rights reserved.  
05.* 文件名称:test.cpp  
06.* 作    者:王鲁峰  
07.* 完成日期:2014 年 3月 6日  
08.* 版 本 号:v1.0  
09.* 对任务及求解方法的描述部分: 
10.* 输入描述:无  
11.* 问题描述: 胖子伤不起
12.* 程序输入:小王 B 175 70
13.* 程序输出:正常体重 
14.* 算法设计:略  
15.*/    
#include<iostream>
using namespace std;
struct Person
{
    char name[20];
    char sex;  //性别  'G'-女,'B'-男
    double height;
    double weight;
};
int main()
{
    double bt,czbl;  //标准体重,超重比例
    Person s;
    cout<<"输入本人的姓名、性别、身高、体重:"<<endl;
    cin>>s.name>>s.sex>>s.height>>s.weight;
    if(s.sex=='G')
        bt=(s.height-70)*0.6;
    else
        bt=(s.height-80)*0.7;
    czbl=(s.weight-bt)/bt;
    if(czbl>0.2)
        cout<<"肥胖"<<endl;
    else if (czbl>0.1)
        cout<<"体重过重"<<endl;
    else if (czbl>-0.1)
        cout<<"正常体重"<<endl;
    else if (czbl>-0.2)
        cout<<"体重过轻"<<endl;
    else
        cout<<"体重不足"<<endl;
    return 0;
}


运行结果:


心得体会:

  哈哈哈  不孬不孬 我的体重正常 继续保持。

# T606750 盖房 ## 题目描述 黄地产,是当今中国,乃至全球的房产巨鳄。在如今“房叔”“房婶”“房姐”等等牛人盛行的社会里,黄地产仍然始终以他的高富帅的作风和冠绝群雄的房产面积称霸四方。大家在惊叹和膜拜之余,也给他了一个亲切而又卖萌的外号——“房哥哥”。 最近,黄地产又在北京四环内买下一大片面积为 S 的土地,准备在上面搞房产。为了使这片楼盘看起来更有艺术美感和高富帅气质,黄地产公司旗下的设计师们为他设计了 N 种同的楼房造型。当然,这样设计出来的每个楼房也就有各自的占地面积(可能相同)。于是黄地产当即拍板,要求他的施工团队马上开始动工。由于钱是问题(高富帅起……),所以想盖多少房就盖多少房,但是为了看起来那么单调,所以一种房子只能盖一次。同时,所有的房子的占地面积总和能超过土地的面积,而黄地产又想让他的土地太过浪费,所以他想要知道在盖完房子后,土地剩余面积最小可以是多少。 ## 输入格式 第一行,一个数字 S 表示土地面积。 第二行,一个数字 n 表示设计的房子数量。 接下来 n 行,一行一个数。第 i 个数表示第 i 个房子的占地面积 ai(超过int范围). ## 输出格式 输出一个数,表示在盖完房子后,土地剩余的面积的最小值。 ## 输入输出样例 #1 ### 输入 #1 ``` 24 6 8 3 12 7 9 7 ``` ### 输出 #1 ``` 0 ``` ## 说明/提示 关于样例,选择第 1,4,5 个房子或者第 2,3,5 个房子来盖,占地面积都恰好为 24,也就是剩下的面积最小为 0. 对于 20% 的数据,n≤3 ; 对于 60% 的数据,n≤16 ; 对于 100% 的数据,0<=S<=20000,0<=n<=30
05-13
<think>好的,我现在需要解决用户的问题,即如何通过选择超过给定土地面积的房子组合,使得剩余的土地面积最小。这个问题看起来像是背包问题的一个变种。让我先理清思路,再结合动态规划的知识来解答。 首先,用户的问题可以转化为:给定一个土地总面积V,和n个房子,每个房子有一个占地面积(正整数),需要选出若干个房子,使得它们的总占地面积超过V,并且尽可能接近V,这样剩余的面积V - 总占地面积就会最小。这确实和0-1背包问题类似,只过在背包问题中我们通常最大化价值,而这里需要最大化体积(即房子的面积),同时超过容量V。因此,可以将问题视为0-1背包问题的一个变种,目标函数变为总重量(面积)的最大化,而是价值。 接下来,我需要确定如何应用动态规划来解决这个问题。根据引用[1]和[4]提到的0-1背包问题的解法,通常动态规划的状态定义为前i个物品在容量j下的最大价值。这里,价值对应房子的面积,因此状态应该表示前i个房子在总占地面积超过j的情况下,能获得的最大总面积。这样,状态转移方程应该是:dp[i][j] = max(dp[i-1][j], dp[i-1][j - area_i] + area_i),其中area_i是第i个房子的面积。当j >= area_i时,可以选择放入或放入该房子;否则只能放入。 过需要考虑的是,这里的状态是否需要压缩空间。因为标准的0-1背包问题可以通过一维数组进行空间优化,即使用一维数组dp[j],并从后往前更新,以避免重复计算。例如,对于每个房子i,遍历j从V到area_i,更新dp[j] = max(dp[j], dp[j - area_i] + area_i)。这样可以将二维数组的空间复杂度降为一维,时间复杂度是O(nV)。 但这里有一个问题:如果土地面积V非常大,比如超过1e4或更高,使用O(V)的空间可能太现实。过用户并没有提到具体的数值范围,假设V在合理范围内,比如1e3到1e4左右,那么动态规划应该是可行的。如果V非常大,可能需要其他方法,比如贪心算法,但贪心可能无法保证最优解。过根据引用[2]和[4],背包问题属于NP完全问题,当容量很大时可能需要近似算法,但用户的问题可能需要精确解,所以动态规划还是首选。 现在,我需要确认动态规划的初始化和边界条件。初始时,dp[0][j]表示没有房子可选时,最大总面积为0。同样,dp[i][0]表示容量为0时,无法放入任何房子,总面积为0。对于一维数组的情况,初始化dp[0] = 0,其他位置初始化为负无穷或者0?,这里应该初始化为0,因为当没有房子时,最大总面积为0。但在处理中,需要保证超过当前容量j,所以一维数组的初始化应该是全0,然后在更新时取较大值。 接下来,实现步骤应该是: 1. 确定目标:求最大总占地面积超过V,使得剩余面积V - sum最小。 2. 动态规划数组dp[j]表示容量为j时的最大总占地面积。 3. 遍历每个房子,然后逆序遍历j从V到当前房子的面积,更新dp[j]。 4. 最后,最大的dp[V]即为最大总占地面积,剩余面积是V - dp[V]。 例如,假设土地面积V=100,房子面积为[20,30,50,60],那么动态规划处理后,dp[100]的值会是尽可能接近100的总面积。比如选30+70=100的话,但可能没有70的房子,假设例子中的组合,比如20+30+50=100的话,剩余0。这时候dp[100]就是100,剩余0。 需要注意的是,当所有房子的总面积之和小于等于V时,剩余面积就是V减去总和,否则就是V - dp[V]。 然后,用户可能需要具体的代码实现。根据引用[1]中的Python代码示例,可以写出类似的动态规划代码。比如: 初始化一个长度为V+1的数组dp,全部初始化为0。然后对于每个房子的面积,从V到该面积逆序更新dp[j] = max(dp[j], dp[j - area] + area)。最终结果是V - dp[V]。 例如,代码可能如下: def minimize_remaining_area(V, areas): dp = [0] * (V + 1) for area in areas: for j in range(V, area -1, -1): if dp[j - area] + area > dp[j]: dp[j] = dp[j - area] + area return V - dp[V] 但需要考虑特殊情况,比如所有房子的面积都大于V,那么无法选择任何房子,此时剩余面积是V。或者当没有房子时,同样返回V。代码中这些情况是否处理了呢?比如,当areas为空,直接返回V。或者,当所有area > V,那么dp数组一直保持0,所以返回V -0 = V。 现在,验证一下这个思路是否正确。例如,测试案例: 案例1: V=10 areas=[3,5,7] 可能的组合:3+5=8,剩余2。或者5+7超过10,行。3+7=10,剩余0。所以正确解是0。根据代码,dp[10]在遍历时,当处理7的时候,当j=10时,检查j >=7,那么dp[10] = max(dp[10], dp[3]+7)。假设之前处理过3和5,那么在处理3时,可能已经填充到3,然后处理5时,j=10时,可能得到5或者3+5=8。处理7的时候,当j=10,dp[3]是3,所以3+7=10,所以dp[10]=10。因此剩余面积是0,正确。 另一个案例,V=5,areas=[6,7],那么无法选任何,返回5。代码中dp[5]保持0,所以5-0=5,正确。 看来这个方法是可行的。 接下来,用户可能需要如何具体应用动态规划,或者是否有其他方法?比如回溯法,但时间复杂度高。动态规划的时间复杂度是O(nV),对于较大的n和V可能太高效,但这是目前的标准解法。 另外,用户可能需要知道如何记录选择的房子,即求具体方案。根据引用[4]中提到的如何求背包的具体方案,可以通过动态规划后的状态数组,逆向追踪每个物品是否被选中。例如,在二维数组中,可以从dp[n][V]开始,查看是否由dp[n-1][V - area_n]转换而来。如果是一维数组的情况下,可能需要额外的步骤记录选择。或者,在动态规划过程中记录选择的路径。这可能稍微复杂,但如果用户需要,可以在解答中给出具体方案的求解方法。 总结步骤: 1. 确定问题转化为0-1背包,目标最大化总重量(面积),超过容量V。 2. 使用动态规划,状态转移方程。 3. 实现代码,注意逆序更新。 4. 处理边界情况。 5. (可选)求具体方案。 现在,我需要将这些思路整理成用户友好的回答,并生成相关问题。</think>### 问题分析与解法 您提出的问题可转化为**0-1背包问题的变种**,目标是将背包容量(土地面积)尽可能填满,最小化剩余空间。以下是分步解决方案: --- ### 1. 动态规划状态定义 定义状态 $dp[j]$ 表示**总土地面积为 $j$ 时,能容纳的最大房子面积总和**。通过遍历所有房子并更新状态,最终 $dp[V]$ 即为最优解,剩余面积为 $V - dp[V]$。 --- ### 2. 状态转移方程 对每个房子面积 $a_i$,逆序遍历容量 $j$(从 $V$ 到 $a_i$): $$ dp[j] = \max(dp[j], dp[j - a_i] + a_i) $$ --- ### 3. 算法实现(Python) ```python def minimize_remaining_area(V, areas): dp = [0] * (V + 1) for a in areas: for j in range(V, a - 1, -1): dp[j] = max(dp[j], dp[j - a] + a) return V - dp[V] ``` --- ### 4. 示例与解释 - **输入**:土地面积 $V=100$,房子面积 $[20, 30, 50, 60]$ - **最优解**:选择 $20+30+50=100$,剩余面积 $0$ - **输出**:`minimize_remaining_area(100, [20,30,50,60])` → $0$ --- ### 5. 时间复杂度与优化 - **时间复杂度**:$O(nV)$,其中 $n$ 为房子数量,$V$ 为土地面积 - **空间优化**:使用一维数组实现状态压缩 - **极端情况**:若所有房子面积均超过 $V$,直接返回 $V$[^1] --- ### 扩展:输出具体选择的房子组合 若需输出具体选择的房子,可通过回溯法追踪状态转移路径: ```python def trace_selected_houses(V, areas): dp = [0] * (V + 1) selected = [[] for _ in range(V + 1)] for a in areas: for j in range(V, a - 1, -1): if dp[j - a] + a > dp[j]: dp[j] = dp[j - a] + a selected[j] = selected[j - a] + [a] return selected[V] ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值