题解 | #称砝码#

称砝码

https://www.nowcoder.com/practice/f9a4c19050fc477e9e27eb75f3bfd49c

解题思路

这是一个组合问题,需要计算所有可能的砝码重量组合。主要思路如下:

  1. 使用集合(Set)存储所有可能的重量组合,初始包含重量0
  2. 对于每种砝码:
    • 获取当前已有的所有重量组合
    • 尝试将当前砝码的1到count[i]倍重量加到已有的每个重量上
  3. 利用集合的去重特性自动处理重复重量
  4. 最终集合的大小即为所有可能的重量组合数量

代码

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

int main() {
    int n;
    cin >> n;
    vector<int> weights(n);
    vector<int> counts(n);
    
    // 输入砝码重量
    for(int i = 0; i < n; i++) {
        cin >> weights[i];
    }
    // 输入砝码数量
    for(int i = 0; i < n; i++) {
        cin >> counts[i];
    }
    
    unordered_set<int> possible_weights{0};  // 初始包含重量0
    
    // 遍历每种砝码
    for(int i = 0; i < n; i++) {
        vector<int> current_weights(possible_weights.begin(), possible_weights.end());
        // 尝试添加1到count[i]个当前砝码
        for(int j = 1; j <= counts[i]; j++) {
            for(int weight : current_weights) {
                possible_weights.insert(weight + weights[i] * j);
            }
        }
    }
    
    cout << possible_weights.size() << endl;
    return 0;
}
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] weights = new int[n];
        int[] counts = new int[n];
        
        // 输入砝码重量
        for(int i = 0; i < n; i++) {
            weights[i] = sc.nextInt();
        }
        // 输入砝码数量
        for(int i = 0; i < n; i++) {
            counts[i] = sc.nextInt();
        }
        
        Set<Integer> possible_weights = new HashSet<>();
        possible_weights.add(0);  // 初始包含重量0
        
        // 遍历每种砝码
        for(int i = 0; i < n; i++) {
            List<Integer> current_weights = new ArrayList<>(possible_weights);
            // 尝试添加1到count[i]个当前砝码
            for(int j = 1; j <= counts[i]; j++) {
                for(int weight : current_weights) {
                    possible_weights.add(weight + weights[i] * j);
                }
            }
        }
        
        System.out.println(possible_weights.size());
    }
}
def get_weight_combinations():
    n = int(input())  # 砝码种数
    weights = list(map(int, input().split()))  # 每种砝码的重量
    counts = list(map(int, input().split()))   # 每种砝码的数量
    
    # 使用集合存储所有可能的重量组合
    possible_weights = {0}  # 初始包含重量0
    
    # 遍历每种砝码
    for i in range(n):
        current_weights = list(possible_weights)
        # 对于当前砝码,尝试添加1到count[i]个
        for j in range(1, counts[i] + 1):
            # 将当前砝码的j倍重量加到已有重量组合中
            for weight in current_weights:
                possible_weights.add(weight + weights[i] * j)
    
    return len(possible_weights)

# 输出结果
print(get_weight_combinations())

算法及复杂度

  • 算法:集合枚举
  • 时间复杂度:,其中 为砝码种数, 为每种砝码的最大数量, 为可能的重量组合数
  • 空间复杂度:,其中 为可能的重量组合数
全部评论

相关推荐

不愿透露姓名的神秘牛友
05-29 15:00
教授A:“你为什么要讲这么久,是要压缩我们对你的评议时间吗?你们别以为这样就能够让我们对你们少点意见。”&nbsp;“从你的发言和论文格式就能知道你的性格啊。”…….&nbsp;感觉被狠狠霸凌了。
码农索隆:“教授您好,首先我想回应您提出的两点疑问。” “关于我讲解时间较长的问题:这绝非为了压缩各位老师的评议时间。这份毕业设计是我过去几个月倾注了全部心血的作品,从构思、实验、调试到撰写,每一个环节都反复打磨。我深知时间宝贵,所以选择详细讲解,是希望能更完整、清晰地展示它的核心创新点、实现过程和验证结果,确保老师们能充分理解它的价值和我的努力。我完全理解并重视评审环节的意义,也做好了充分准备来听取各位老师的专业意见和批评。几个月的研究都坚持下来了,我怎么可能害怕老师们的点评呢?今天站在这里,正是抱着虚心学习、诚恳求教的态度而来。” “如果我的展示确实超时,影响了后续流程,烦请老师们随时示意,我会立刻调整。我非常期待并预留了充足的时间,希望能听到老师们宝贵的建议和深入的讨论。” “其次,关于您提到‘从发言和论文格式就能知道我的性格’。教授,我对此感到非常困惑和不安。学术研究和答辩的核心,难道不应该是作品本身的质量、逻辑的严谨性、数据的可靠性和结论的合理性吗?论文格式有明确的规范要求,我尽最大努力遵循了这些规范。如果格式上存在疏忽或不足,这属于技术性、规范性的问题,恳请老师们具体指出,我一定认真修改。但将格式问题或个人表达风格(如讲解时长)直接上升为对个人性格的评判,甚至以此作为质疑我学术态度和动机的依据,这让我感到非常不公平,也偏离了学术评议应有的客观和严谨原则。” “我尊重每一位评审老师的专业权威,也衷心希望能得到老师们对我的工作内容本身的专业指导和批评指正。任何基于研究本身的意见,无论多么尖锐,我都会认真聆听、反思并改进。但我恳请老师们,能将评议的焦点放在我的研究本身,而不是对我个人进行主观的推断或评价。谢谢各位老师。”
点赞 评论 收藏
分享
爱吃肉的伊登在写日记:好棒,27届简历能做成这个样子,但是第一个项目感觉cover住难度还是不小的,特别是二面的时候肯定要对分布式系统设计这一块儿有高出正常面试者的水平才行
点赞 评论 收藏
分享
投递美团等公司6个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务