AC自动机

[蓝桥杯 2021 省 AB] 砝码称重

题目描述:

你有一架天平和 N 个砝码, 这 N 个砝码重量依次是 W1, W2 .. ..WN 。 请你计算一共可以称出多少种不同的重量?

注意砝码可以放在天平两边。

思路:总共可选择的重量在1到总重之间。f[i][j] 表示在前i个砝码中重量为j.

可分为四种状态:

1.当 j==a[i] f[i][j]=1。

2.当f[i-1][j]==1 f[i][j]=1. 无需添加。

3.当 f[i-1][j+a[i]]==1 f[i][j]=1.可添加一个当前砝码。

4.当 f[i-1][j-a[i]]==1 f[i][j]=1.可减少一个当前砝码。

复制代码
#include <iostream>
using namespace std;
int a[110];
int f[110][100010];
int main()
{
	int n;
	cin>>n;
	int sum=0;
	for (int i=1;i<=n;i++){
		cin>>a[i];
		
		sum+=a[i];
	}
	
	for (int i=1;i<=n;i++){
		for (int j=sum;j;j--){
			if(j==a[i])f[i][j]=1;
			else if (f[i-1][j]==1)f[i][j]=1;
			else if (f[i-1][j+a[i]]==1)f[i][j]=1;
			else if (f[i-1][abs(j-a[i])]==1) f[i][j]=1;
		}
	}
	int ans=0;
    
	for (int i=1;i<=sum;i++){
		if(f[n][i]==1){
			ans++;
		}
	}

	cout<<ans;
	
	
}
相关推荐
草莓熊Lotso19 小时前
【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day8
c语言·开发语言·c++·刷题·强化训练
草莓熊Lotso8 天前
【洛谷题单】--分支结构(三)
c语言·c++·刷题·洛谷
草莓熊Lotso12 天前
【洛谷题单】--分支结构(二)
c语言·c++·经验分享·其他·刷题
草莓熊Lotso20 天前
【LeetCode刷题指南】--单值二叉树,相同的树
c语言·数据结构·算法·leetcode·刷题
Lenyiin24 天前
《LeetCode 热题 100》整整 100 题量大管饱题解套餐 中
java·c++·python·leetcode·面试·刷题·lenyiin
草莓熊Lotso1 个月前
【LeetCode刷题指南】--有效的括号
c语言·数据结构·其他·算法·leetcode·刷题
草莓熊Lotso1 个月前
【数据结构初阶】--双向链表(二)
c语言·数据结构·经验分享·链表·刷题
草莓熊Lotso1 个月前
【LeetCode刷题指南】--数组串联,合并两个有序数组,删除有序数组中的重复项
c语言·数据结构·其他·刷题
charlie1145141911 个月前
我的Qt八股文笔记2:Qt并发编程方案对比与QPointer,智能指针方案
笔记·qt·面试·刷题·并发编程·异步
凤年徐1 个月前
【数据结构与算法】203.移除链表元素(LeetCode)图文详解
c语言·开发语言·数据结构·算法·leetcode·链表·刷题