0%

状压dp

状压dp

背包问题

如果要表示物品放不放:如果五个物品都不放,可以用00000表示;如果五个物品都放,可以用11111表示

可以用一个维度表示所有物品放与不放的情况,这个过程就叫做状态压缩

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include<stdio.h>
const int INF = 1 << 15;
int dp[INF + 10];
int dp1[INF+ 10] ; //定义状态
void print1(int num);
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
int W[20],C[20];
for(int i = 0; i < n; i++)
scanf("%d %d",&C[i],&W[i]) ;
int res = -1;
for(int i = 0; i < (1 << n); i++)
{
for(int j = 0; j < n; j++)
{
if(!(i&(1 << j))) //状态转移
{
int temp = i | (1<<j);
dp[temp] = dp[i] + W[j];
dp1[temp] = dp1[i] + C[j];

}
}
}
for(int i = 0; i < (1 << n); i++)
{
print1(i);
printf("\t%d\t%d\n",dp[i],dp1[i]); //打印出每种方案的情况,价值 和耗费的空间
}

}
return 0;
}
void print1(int num)
{
int k= 0;
if(num == 0)
printf("0");
for(;(1 << k) <= num; k++)
{
if(num & (1<<k))
printf("1");
else
printf("0");
}
}