P2347 砝码称重——By C++

题目描述

设有1g1g、2g2g、3g3g、5g5g、10g10g、20g20g的砝码各若干枚(其总重\le 1000≤1000),

输入输出格式

输入格式:

 

输入方式:a_1 , a_2 ,a_3 , a_4 , a_5 ,a_6a1​,a2​,a3​,a4​,a5​,a6​

(表示1g1g砝码有a_1a1​个,2g2g砝码有a_2a2​个,…,20g20g砝码有a_6a6​个)

 

输出格式:

 

输出方式:Total=NTotal=N

(NN表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)

 

输入输出样例

输入样例#1: 复制

1 1 0 0 0 0

输出样例#1: 复制

Total=3

 

动态规划求方案个数

#include <bits/stdc++.h>

using namespace std;

int main()
{
	int weight[7] = {1,2,3,5,10,20}, num[7], res = 0;
	bool visited[1002] = {0};
	for(int i = 0; i < 6; i++)
		cin >> num[i];
	visited[0] = true;
	for(int i = 0; i < 6; i++)
		for(int j = 0; j < num[i]; j++)
			for(int k = 1000; k>=0; k--)
				if(visited[k] && k+weight[i] <= 1000)
					visited[k+weight[i]] = true;
	for(int i = 1; i <= 1000; i++)
		if(visited[i])
			res++;
	cout << "Total=" << res << endl;
	return 0;
}

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中,使用砝码称重通常涉及到一个简单的数学问题,可以使用数组或向量来存储不同重量的砝码,然后通过遍历和比较找到组合来达到给定的总重量。这是一个基本的动态规划或者背包问题的简化版。 以下是一个简单的示例代码,假设我们有一个砝码数组`weights`,每个元素代表一个砝码的重量,我们想要找出如何使用这些砝码来达到目标重量`target`: ```cpp #include <iostream> #include <vector> // 假设weights是一个非降序的数组,存储了不同重量的砝码 std::vector<int> weights = {1, 2, 5}; // 示例砝码:1g, 2g, 5g int targetWeight = 10; // 示例目标重量 std::vector<bool> used(weights.size(), false); // 用于记录砝码是否被使用 void findWeight(int weight) { if (weight == targetWeight) { printSolution(used); return; } // 遍历所有砝码 for (int i = 0; i < weights.size(); ++i) { if (weights[i] <= weight && !used[i]) { used[i] = true; // 使用这个砝码 findWeight(weight + weights[i]); // 尝试增加砝码 used[i] = false; // 如果没用到,还原状态 } } } void printSolution(std::vector<bool>& used) { if (used.empty()) return; std::cout << "Solution: "; for (int i = 0; i < used.size(); ++i) { if (used[i]) std::cout << weights[i] << " "; } std::cout << "\n"; } int main() { findWeight(0); return 0; } ``` 在这个例子中,`findWeight`函数通过递归尝试添加每一个砝码,直到达到或超过目标重量。如果找到解决方案,就调用`printSolution`来展示如何组合砝码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值