首页 > 其他分享 >P2347 NOIP1996 提高组 砝码称重

P2347 NOIP1996 提高组 砝码称重

时间:2023-11-04 13:22:27浏览次数:45  
标签:标记 int sum P2347 砝码 NOIP1996 include 称重

P2347 NOIP1996 提高组 砝码称重

最初思路

看出来是多重背包,但是第一次用于求方案数,一开始想的是累加。但是实现起来发现结果很抽象,想想也不是那么回事。比如从样例上来说,F[3] = 1F[2] = 1F[1] = 1,显然F[3] != F[1] + F[2]

改进思路

然后受到启发,决定用打标记的思想,即若重量\(j\)是可行的,就用F[j]标记,然后用动态规划转移这些标记。

F[J] = F[j - w[i]] ? 1 : 0

思路其实是正确的,但是代码实现出了很多问题。

代码实现

\(8pts\)code
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int v[7], w[7] = {0, 1, 2, 3, 5, 10, 20};
int F[1010];
int sum = 0;
int ans;

int main()
{
	for (int i = 1; i <= 6; i++)
	{
		cin >> v[i];
		sum += v[i] * w[i];
	}
	for (int i = 1; i <= 6; i++)
	{
		F[w[i]] = 1;
	}
	for (int i = 1; i <= 6; i++)
	{
		for (int j = sum; j >= 0; j--)
		{
			for (int k = 1; k <= v[i]; k++)
			{
				if (k * w[i]  <= j)
				{
					if (F[j - k * w[i]])
						ans++;
				}
				else
				{
					if (F[j])
					{
						continue;
					}
				}

			}
		}
	}
	printf("Total=%d", ans);
	return 0;
}
首先初始化问题
  • 这是一个不能想当然的过程,我想当然把所有初始砝码重量都赋值为1。
  • 直到在每次ans++时调试输出\(j\)才发现问题,最终总结出应把F[0] = 1即可。
if顺序问题
  • 本题的\(F[j]\)是完全有可能在\(j >= k*w[i]\)时也被标记过的,因为这是标记该重量可行,答案只需统计一次,而if (F[j]) continue;则是为了避免重复统计答案,但是该语句放到else后则无法处理\(j >= k*w[i]\)时\(F[j]\)被标记过的情况。
ACcode
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int v[7], w[7] = {0, 1, 2, 3, 5, 10, 20};
int F[1010];
int sum = 0;
int ans;

int main()
{
	for (int i = 1; i <= 6; i++)
	{
		cin >> v[i];
		sum += v[i] * w[i];
	}
	F[0] = 1;
	for (int i = 1; i <= 6; i++)
	{
		for (int j = sum; j >= 0; j--)
		{
			for (int k = 1; k <= v[i]; k++)
			{
				if (F[j])
				{
					continue;
				}
				if (k * w[i]  <= j)
				{
					if (F[j - k * w[i]])
						F[j] = 1, ans++;
				}
			}
		}
	}
	printf("Total=%d", ans);
	return 0;
}

标签:标记,int,sum,P2347,砝码,NOIP1996,include,称重
From: https://www.cnblogs.com/kdlyh/p/17809222.html

相关文章

  • 称重式液体灌装机物联网解决方案,远程监控,故障报警
    称重式液体灌装机是一种用于将液体或半固体物料进行自动化灌装的机器设备。它主要由灌装系统、封口系统、输送系统和控制系统组成。在食品、医药、化工、建材等行业中,称重式液体灌装机的自动化改造是一个非常重要的环节,可以提高生产效率和产品质量,有效降低生产成本。 为加强称重式......
  • 【洛谷 8742】[蓝桥杯 2021 省 AB] 砝码称重
    题目描述你有一架天平和 �N 个砝码,这 �N 个砝码重量依次是 �1,�2,⋯ ,��W1​,W2​,⋯,WN​ 。请你计算一共可以称出多少种不同的重量?注意砝码可以放在天平两边。输入格式输入的第一行包含一个整数 �N 。第二行包含 �N 个整数: �1,�2,�3,⋯ ,��W1​,W2​,W3​,⋯,WN​......
  • 【洛谷 2347】[NOIP1996 提高组] 砝码称重
    题目描述设有 1g1g、2g2g、3g3g、5g5g、10g10g、20g20g 的砝码各若干枚(其总重≤1000≤1000),可以表示成多少种重量?输入格式输入方式:�1,�2,�3,�4,�5,�6a1​,a2​,a3​,a4​,a5​,a6​(表示 1g1g 砝码有 �1a1​ 个,2g2g 砝码有 �2a2​ 个,…,20g20g 砝码有 �6a6​ 个)输出格式......
  • 砝码称重 题解
    砝码称重题解前言这道题时限完全可以开到1s,空间也开不到1024kb白想那么多优化(不过这个复杂度可能是目前来看最合理(算出来保证能过)的。题意简述有一个长度为\(n\)的序列\(a\),有两种操作:把\(l\)到\(r\)的所有数改为\(x\);查询用\(l\)到\(r\)的所有数(每个数可......
  • 差分信号隔离转换称重传感器压力应变桥信号处理隔离变送器0-10mV/0-20mV/0-±10mV/0-
    主要特性DIN11IPO压力应变桥信号处理系列隔离放大器是一种将差分输入信号隔离放大、转换成按比例输出的直流信号导轨安装变送模块。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等行业。此系列模块内部嵌入了一个高效微功率的电源,向输入端和输出端提供隔离的电源......
  • 称重系统,过磅软件,地磅程序,c#源码
    称重系统,过磅软件,地磅程序,c#源码原创文章,转载请说明出处,资料来源:http://imgcs.cn/5c/636690132752.html......
  • AcWing——砝码称重
    4942.砝码称重-AcWing题库1、题目给定一个天平和101个砝码。101个砝码的重量依次为n⁰,n¹,n²,…,n¹⁰⁰克,其中n是一个不小于2的整数。请你判断,我们能否利用给定天平和砝码对重量为m克的物品进行称重。注意,天平的两端都可以放入砝码。具体来说,你的任务是判断是否可......
  • 三菱FX3U与8和称重仪通信的程序。 主要功能是记录8个工位的
    三菱FX3U与8和称重仪通信的程序。主要功能是记录8个工位的重量,用威纶通FTP服务器下载到电脑里打印或修改。程序使用ST语言与梯形图的接合运用,使用三菱MODBUS专用指令,8站轮询,当有从站通信故障后三次重试失败后会踢出轮训,确保其他从站通信正常!触摸屏做了完美的通信故障报警,以及通信......
  • 欧姆龙 PLC CP1E 与电子称重仪表“柯力XK3101”Modbus RTU通信,稍微更改下Modbus通信地
    欧姆龙PLCCP1E与电子称重仪表“柯力XK3101”ModbusRTU通信,稍微更改下Modbus通信地址可以跟其他Modbus设备进行通信!YID:5545635998335748......
  • 基于PLC控制的自动称重贴标机如何实现远程故障维护
    在社区电商、生产流水线、物流快递等行业,需要对产品进行称重,打印重量信息标签并实时贴标。传统人工工作模式强度大、成本高、生产效率低,而通过PLC控制的称重贴标设备可以适应自动化、高速率的生产节奏,有效提高称重、打印、贴标的工作效率。物通博联工业智能网关适配多种PLC协议和数......