萌新96pts求助,为啥只有第19个点会WA
查看原帖
萌新96pts求助,为啥只有第19个点会WA
1067386
beiyu123楼主2024/4/8 17:48
#include<iostream>
#include<cstdio>
#include<algorithm>
//#include<map>//直接用二维数组可能会炸,改用map,键为重量和,值为最小刀数
#include<unordered_map>
using namespace std;
long int n, m, temp, arr[35], ans = 2147483646, mid;
unordered_map<int, int> mp;
void dfs1(long int sum, int cut, int index) {
	if (sum > m || cut > ans || (mp.count(sum) && mp[sum] < cut)) return;
	if (sum == m) ans = (cut < ans) ? cut : ans;
	if (index == mid + 1) {
		if (mp.count(sum)) mp[sum] = (cut < mp[sum]) ? cut : mp[sum];
		else mp[sum] = cut;//一次搜索结束时填充map
		return;
	}
	dfs1(sum, cut, index + 1);
	dfs1(sum + arr[index], cut + 1, index + 1);
	dfs1(sum + 2 * arr[index], cut, index + 1);
}
void dfs2(long int sum, int cut, int index) {
	if (sum > m || cut > ans) return;
	if (sum == m) ans = (cut < ans) ? cut : ans;
	if (index == n + 1) {
		if (!mp.count(sum)) mp[sum] = cut;
		if (mp.count(m - sum)) ans = (mp[sum] + mp[m - sum] < ans) ? mp[sum] + mp[m - sum] : ans;
		return;
	}
	dfs2(sum, cut, index + 1);
	dfs2(sum + arr[index], cut + 1, index + 1);
	dfs2(sum + 2 * arr[index], cut, index + 1);
}
int main() {
	scanf("%ld %ld", &n, &m);
	m *= 2;//m两倍,则单瓜两倍为整瓜单倍为半瓜,sum也就可以改为long int了
	for (int i = 0; i < n; i++) scanf("%ld", &arr[i]);
	sort(arr, arr + n);//排序可优化搜索顺序
	mid = (n - 1) / 2;
	dfs1(0, 0, 0);//dfs1从0搜到mid
	dfs2(0, 0, mid + 1);//dfs2从mid+1搜到n-1
	printf("%ld", (ans == 2147483646) ? -1 : ans);
	return 0;
}
基本上每三次提交有一次tle,两次WA,答案是3我输出的是2

2024/4/8 17:48
加载中...