急!求助 24 pts
查看原帖
急!求助 24 pts
787131
VictorTang楼主2024/8/2 21:37
#include<iostream>
#include<map>
#define int long long
using namespace std;

int n, m, a[25];
map<int, int> last;

bool mem[300005];
int cache[300005];

int solve(int used){
	if (used == ((1 << n) - 1))
		return 1;   // 最后也是一种合法的分组数量

	if (mem[used]) return cache[used];

	int ret = 99;
	for (int i=0; i<n; i++){
		int mask = 1 << i;
		if (used & mask) continue;
		if (last[used] + a[i] > m)
			last[used + mask] = a[i];
		else
			last[used + mask] = last[used] + a[i];
		ret = min(ret, solve(used + mask) + (last[used] + a[i] > m));
	}
	
	mem[used] = true;
	return cache[used] = ret;
}

signed main(){
	cin >> n >> m;
	for (int i=0; i<n; i++) cin >> a[i];
	cout << solve(0);
}

dfs得24分,为什么?谢谢!

2024/8/2 21:37
加载中...