状压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"); } }
|