关于状态=0的时候dp数组的初值
查看原帖
关于状态=0的时候dp数组的初值
535729
Tu_es_trop_belle楼主2022/11/9 20:38

刚学状压不是很理解
为什么下面这份代码中把

f[0] = 0;

换成

f[0] = 1;

才是正确的呢?如果状态=0的话按说只需要0个电梯就可以啊。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int INF = 0x3f3f3f3f;
const int R18 = 74;
int n, W, f[(1 << 18) + R18], a[R18];
int rest[(1 << 18) + R18];
signed main()
{
	scanf("%d%d", &n, &W);
	for (int i = 1; i <= n; ++i)
		scanf("%d", a + i);
	memset(f, INF, sizeof(f));
	f[0] = 1; rest[0] = W;
	for (int i = 0;  i < (1 << n); ++i)
	{
		for (int j = 1; j <= n; ++j)
		{
			if ((i >> (j - 1)) & 1) continue;
			else
			{
				if (rest[i] >= a[j]) 
				{
					if (f[i | (1 << (j - 1))] >= f[i])
					{
						f[i | (1 << (j - 1))] = f[i];
						rest[i | (1 << (j - 1))] = max(rest[i] - a[j], rest[i | (1 << (j - 1))]);
					}
				}
				else
				{
					if (f[i | (1 << (j - 1))] >= f[i] + 1)
					{
						f[i | (1 << (j - 1))] = f[i] + 1;
						rest[i | (1 << (j - 1))] = max(rest[i | (1 << (j - 1))], W - a[j]); 
					}
				}
			}
		}
	}
	printf("%d", f[(1 << n) - 1]);
	return 0;
}

2022/11/9 20:38
加载中...