您的位置:首页 > 其它

POJ 2923 Relocation (状态压缩 0-1背包)

2012-07-31 19:52 393 查看
题目链接:(—_—) zZ

题目大意:有n个物品用2个车来运输, 每个物品有一定的重量, 每个车能承受一定的重量, 现在要求用车把物品从老房子运输到新房子, 问至少要运多少趟

Ps:我太弱了, 不会状态压缩, 第一回乱搞超时,看了大牛的状态压缩,哦了

code:

#include <stdio.h>
#include <string.h>
#define min(a, b) a>b? b:a
int n =0, c[2], w[12], s[1026], dp[1026];
int judge(int x)
{
int i = 0, j = 0, sum = 0, dp[1026];
memset(dp, 0, sizeof(dp));
dp[0] = 1;
for(i = 0; i<n; i++)
{
if(x&(1<<i))
{
sum += w[i];
for(j = c[0]; j>=w[i]; j--)
if(dp[j-w[i]]) dp[j] = 1;
}
}
for(i = 0; i<=c[0]; i++)
if(dp[i] && sum-i<=c[1])
return 1;
return 0;
}
int main()
{
int i = 0, j = 0, t = 0, item = 0, count = 0, count1 = 0;
scanf("%d", &t);
while(t--)
{
count =0;
scanf("%d %d %d", &n, &c[0], &c[1]);
item = 1<<n;
for(i = 0; i<n;  i++)
scanf("%d", &w[i]);
for(i = 0; i<item; i++)
if(judge(i)) s[count++] = i;//判断当前方案能否运输一趟
for(i = 0; i<item; i++)
dp[i] = 1234567890;
dp[0] = 0;
for(i = 0; i<count; i++)
{
for(j = item-1-s[i]; j>=0; j--)
if(!(j&s[i]))//每个物品只能运输一趟, 不能重复
dp[j|s[i]] = min(dp[j|s[i]], dp[j]+1);//在运输了状态j上,在运输s[i], 变成状态j|s[i]
}
printf("Scenario #%d:\n", ++count1);
printf("%d\n\n", dp[item-1]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: