蓝桥杯 砝码称重【第十二届】【省赛】【A组】 C++ dp动态规划 背包问题

这篇博客探讨了一种资源限制问题,即在给定的砝码重量集合下,如何通过动态规划算法确定能称量多少种不同的重量。程序以C++实现,主要逻辑在于考虑每个砝码的三种可能放置情况,并更新可行的重量组合计数。最后输出可行的重量方案数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

资源限制

时间限制:1.0s   内存限制:256.0MB

#include<iostream>
#include<cmath>
using namespace std;
const int N = 110, M = 1e5 + 10;
int n, sum, w[N];
int f[N][M];//f[i][j]表示用前i个砝码是否能称量j重量,1为可,0为不能
//显然易知左物右码
//对于第i个砝码,有三种可能,即,不选,放左边,放右边。只要三者其中之一是可行,那么f[i][j]即可行
//不选 f[i][j]=f[i-1][j]
//放左边 f[i][j]=f[i-1][j+w[i]]
//放右边 f[i][j]=f[i-1][abs(j-w[i])] abs取绝对值防止下标为负数
int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		cin >> w[i];
		sum += w[i];
	}
	f[0][0] = true;//显然不用砝码便能称量0重量
	for (int i = 1; i <= n; i++)
	{
		for (int j = 0; j <= sum; j++)
		{
			f[i][j] = f[i - 1][j] || f[i - 1][j + w[i]] || f[i - 1][abs(j - w[i])];//三种情况有一种可行即可行
		}
	}
	int ans = 0;
	for (int j = 1; j <= sum; j++)
	{
		if (f[n][j])ans++;//在n个砝码和的范围内,统计可行方案
	}
	cout << ans;
	return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Prudento

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值