包子凑数(蓝桥杯17H)————动态规划+二分查找

cpp 复制代码
#include<iostream>
using namespace std;
int gcd(int a,int b) {
	int tmp;
	if (a<b) {
		tmp = a;
		a = b;
		b = tmp;
	}
	return b == 0 ? a : gcd(b,a%b);
}
int main() {
	int dp[10001],n;
	memset(dp,0,sizeof(dp));
	cin >> n;
	int* a = new int[n];
	int g,maxn = 0;
	for (int i = 0; i < n;i++) {
		cin >> a[i];
		if (i == 0) {
			g = a[i];
		}
		else {
			g = gcd(g,a[i]);
		}
		maxn = max(maxn, a[i]);
	}
	if (g != 1) {
		cout << "INF";
		return 1;
	}
	dp[0] = 1;
	for (int i = 0; i < n;i++) {
		for (int j = a[i]; j < 10001;j++) {
			dp[j] = (dp[j]>0||dp[j-a[i]]>0)?1:0;
		}
	}
	for (int i = 10001/2; i>0;i/=2) {
		int cnt = 0;
		for (int j = i; j > i - maxn;j--) {
			if (dp[j] == 1) {
				cnt++;
			}
		}
		if (cnt != maxn) {
			int ans = 0;
			for (int z = 1; z <= i * 2;z++) {
				if (!dp[z]) {
					ans++;
				}
			}
			cout << ans;
			return 0;
		}
	}
	return 0;
}
相关推荐
柠檬071126 分钟前
matlab cell 数据转换及记录
算法
YuTaoShao1 小时前
【LeetCode 每日一题】2221. 数组的三角和
数据结构·算法·leetcode
little~钰1 小时前
树上倍增和LCA算法---上
算法
力扣蓝精灵1 小时前
今日分享 整数二分
算法
mc23561 小时前
5分钟学会微算法——Brian Kernighan 算法
算法
Excuse_lighttime1 小时前
除自身以外数组的乘积
java·数据结构·算法·leetcode·eclipse·动态规划
万添裁1 小时前
归并排序的三重境界
数据结构·算法
程序员三明治1 小时前
【重学数据结构】队列 Queue
数据结构·后端·算法
Coision.1 小时前
Linux C: 函数
java·c语言·算法
杜小暑1 小时前
数据结构之双向链表
c语言·数据结构·后端·算法·链表·动态内存管理