首页 > 其他分享 >一个有趣的问题

一个有趣的问题

时间:2023-08-02 18:11:58浏览次数:32  
标签:cout 一个 sum namespace 问题 int 有趣 include dp

给定 \(N\) 个数 \(A_1,\cdots ,A_N\),问可不可以把它们分成两组,使得两组的和相同。

没有数据范围。

有一个很简单的 dp 方法,\(dp_{i,x}|=dp_{i-1,x-a_i}\)。 看 \(dp_{n,\frac{sum}{2}}\) 是否为 \(1\)。时间复杂度 \(O(N\times \sum_{i=1}^{N}A_i)\)。

code
#include <bits/stdc++.h>

using namespace std;

#define de(x) cout<<#x<<"="<<x<<endl

using ll = long long;

const int N = 5e2+2;
const int M = 5e5+5;

int n,sum;
int a[N];
bool dp[N][M]; 

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);

	freopen("input.txt","r",stdin);
	freopen("ans.txt","w",stdout);
	cin>>n;
	for (int i=1; i<=n; i++){
		cin>>a[i];
		sum+=a[i];
	}
	dp[0][0]=1;
	for (int i=1; i<=n; i++){
		for (int j=0; j<M; j++){
			dp[i][j]|=dp[i-1][j];
			if (j>=a[i]){
				dp[i][j]|=dp[i-1][j-a[i]];
			}
		}
	}
	if (sum%2==0 && dp[n][sum/2]){
		cout<<"YES"<<endl;
	}
	else{
		cout<<"NO"<<endl;
	}
	return 0;
}

// don't waste time!!!

但是,这个方法和 \(A\) 的值域有关,\(\max A_i\) 或 \(\sum_{i=1}^{n} A_i\) 大的时候不会很好。

我尝试了一个随机的方法,是这样的。

每一次 \(random\ shuffle\) 一次,贪心选择。如果 \(cur\ge A_i\)(\(cur\) 从 \(\frac{sum}{2}\) 开始)就选,否则不选。成功概率是什么呢?

code
#include <bits/stdc++.h>

using namespace std;

#define de(x) cout<<#x<<"="<<x<<endl

using ll = long long;

const int N = 1e3+3;

int n;
int a[N];

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);

	freopen("input.txt","r",stdin);
	freopen("output.txt","w",stdout);
	int sum=0;
	cin>>n;
	for (int i=1; i<=n; i++){
		cin>>a[i];
		sum+=a[i];
	} 
	if (sum&1){
		cout<<"NO"<<endl;
		return 0;
	}
	sum/=2;
	for (int ti=1; ti<=50; ti++){
		random_shuffle(a+1,a+1+n);
		for (int i=1; i<=n; i++){
			if (sum>=a[i]){
				sum-=a[i];
			}
		}
		if (sum==0){
			cout<<"YES"<<endl;
			return 0;
		}
	}
	cout<<"NO"<<endl;
	return 0;
}

// don't waste time!!!

我写了一个随机数据生成器。

generator
#include <bits/stdc++.h>

using namespace std;

#define de(x) cout<<#x<<"="<<x<<endl

using ll = long long;

const int N = 500;
const int A = 1000;

mt19937 rng((int) std::chrono::steady_clock::now().time_since_epoch().count());
int rnd(int x, int y){
  return uniform_int_distribution<int>(x, y)(rng);
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);

	freopen("input.txt","w",stdout);
	cout<<N<<endl;
	for (int i=1; i<=N; i++){
		cout<<rnd(1,A)<<" ";
	}
	cout<<endl;
	return 0;
}

// don't waste time!!!

跑了 \(1000\) 组数据,成功率 \(84.1\%\)。

如果 \(N,A\) 分别改成 \(1000,100\),成功率 \(100\%\)。

有没有更好的方法?待更。

标签:cout,一个,sum,namespace,问题,int,有趣,include,dp
From: https://www.cnblogs.com/SFlyer/p/17601416.html

相关文章

  • PFS内存统计信息的聚合与准确性问题(四)
    内存统计信息的聚合内存统计信息的聚合总共有5个维度,也分别对应以下5张表,分别是:MEMORY_SUMMARY_BY_ACCOUNT_BY_EVENT_NAMEMEMORY_SUMMARY_BY_HOST_BY_EVENT_NAMEMEMORY_SUMMARY_BY_THREAD_BY_EVENT_NAMEMEMORY_SUMMARY_BY_USER_BY_EVENT_NAMEMEMORY_SUMMARY_GLOBAL_BY_EVEN......
  • python3 番外篇之Linux环境安装问题
    问题一、Linux主机openSSL版本较老[root@zabbix-serveralertscripts]#python3feishu.pyTraceback(mostrecentcalllast):File"feishu.py",line3,in<module>importrequestsFile"/usr/local/python3.8/lib/python3.8/site-packages/reque......
  • Lua script attempted to access a non local key in a cluster node 问题解决
    一、问题描述最近优化公司需要对不同的业务系统的缓存工具提供一个标准化的解决方案。各个业务系统将缓存数据通过map结构进行存储,然后在缓存系统中将这些map获取出来,然后保存在redis数据库中。技术经理想到的最好解决方案是将map集合直接存储在redis的hash表中。但是要求对hash......
  • CDN能解决的问题
    CDN能解决的问题第一,CDN能够有效降低源站的负载。因为静态内容已经通过CDN缓存在边缘节点之上,用户请求可以在CDN边缘节点上处理,不会回到源站,可以大幅降低源站负载,规避风险和提升源站稳定性,同时,也会降低相应的资源建设成本。第二,CDN通过就近分发的方式,能够有效提升访问体验。比如......
  • 【python_1】第一个python程序!
    打开CMD(命令提示符)程序,输入python并回车;输入:print("HelloWorld!")然后回车;print代表的是打印输出的意思;这段代码的含义就是:在屏幕上输出引号内的内容。代码中使用的符号()""必须是英文符号。持续更新【python】系列!有需要的请移步秃头程序媛!......
  • 恒创科技:当服务器域名出现解析错误的问题该怎么办?
    ​域名解析是互联网用户接收他们正在寻找的域的地址的过程。更准确地说,域名解析是人们在浏览器中输入时使用的域名与网站IP地址之间的转换过程。您需要站点的IP地址才能知道它所在的位置并加载它。但,在这个过程中,可能会出现多种因素导致您的域名无法解析。要排除故障,请使用以......
  • CDN能解决的问题
    CDN能解决的问题第一,CDN能够有效降低源站的负载。因为静态内容已经通过CDN缓存在边缘节点之上,用户请求可以在CDN边缘节点上处理,不会回到源站,可以大幅降低源站负载,规避风险和提升源站稳定性,同时,也会降低相应的资源建设成本。第二,CDN通过就近分发的方式,能够有效提升访问体验。比如......
  • 节省显示器同时提升持续集成问题修复及时性的“流水线问题责任聚焦”实验
    作为企业IT部门某个开发团队负责人的你,从书上和大佬那里得知,软件开发团队,如果采用持续集成实践,那么就能降低软件开发过程中的返工。于是你按照书中和大佬所说的,在团队工位显眼位置,摆放了一个大显示器,并接上持续集成流水线。你喊团队中所有的5位开发人员来开会,告诉他们,一旦流水线......
  • # yyds干货盘点 # 盘点一个Python递归的基础题目
    大家好,我是皮皮。一、前言前几天在Python黄金群【维哥】问了一个Python递归的基础问题,一起来看看吧。看上去代码没多少哈,但是韵味无穷。二、实现过程很多初学者遇到这个问题,很容易把答案说成是3,2,2这样,其实正好相反,这里【巭孬嫑勥烎】给了一个解释。这么一看好像还是不太好理解,看看......
  • 盘点一个Python递归的基础题目
    大家好,我是皮皮。一、前言前几天在Python黄金群【维哥】问了一个Python递归的基础问题,一起来看看吧。看上去代码没多少哈,但是韵味无穷。二、实现过程很多初学者遇到这个问题,很容易把答案说成是3,2,2这样,其实正好相反,这里【巭孬嫑勥烎】给了一个解释。这么一看好像还是不太好......