hdu - 1059 Dividing
2012-08-29 08:44
225 查看
多重背包问题,一般有三种思路优化:1.用2^n拆分数量,转化为01背包。2.当成完全背包来做,需要用一个数组记录每个物品的数量,当使用次数超过时结束。3.用单调队列优化(目前还不懂的说)。上次做男人八题里的coin时我用的是第二种思路,这次我用的是第一种。
#include <stdio.h> #include <string.h> bool dp[60006]; int a[10],b[100]; int cnt,sum; bool read() { int i; bool f = 0; sum = 0; for(i = 1; i <= 6; i++) { scanf("%d",&a[i]); if(a[i]) f = 1; sum += a[i]*i; } return f; } void inst(int n) { for(int i = 0; a >= (1<<i); i++) { b[cnt++] = (1<<i)*n; a -= (1<<i); } if(a ) b[cnt++] = a *n; } int main() { int i,j,cas=1; bool ok; while(read()) { printf("Collection #%d:\nCan",cas++); if(sum & 1) { printf("'t be divided.\n\n"); continue; } cnt = 0; for(i = 1; i <= 6; i++) inst(i); sum /= 2; ok = 0; memset(dp,0,sizeof dp); dp[0] = 1; for(i = cnt-1; i >= 0; i--) { if(dp[sum]) {ok = 1; break;} if(b[i] > sum) break; for(j = sum; j >= b[i]; j--) if(dp[ j-b[i] ]) dp[j] = 1; } if(!ok) printf("'t"); printf(" be divided.\n\n"); } return 0; }
相关文章推荐
- HDU 1059(Dividing)多重背包
- HDU1059-Dividing-DP(多重背包)
- hdu 1059 Dividing 多重背包
- HDU1059 Dividing(背包问题)
- [0-1背包]HDU 1059 Dividing
- hdu 1059 Dividing(二进制转化优化) 分组背包
- hdu 1059 Dividing
- HDU 1059 Dividing
- Hdu 1059 Dividing & Zoj 1149 & poj 1014 Dividing(多重背包)
- hdu 1059 Dividing
- HDU 1059 Dividing
- HDU-1059 Dividing (多重背包 二进制优化+剪枝)
- hdu 1059 Dividing
- hdu 1059 Dividing(多重DP)
- (母函数经典题 与2082类似)hdu 1059 Dividing
- (step3.3) hdu 1059(Dividing——多重背包)
- HDU1059——Dividing多重背包
- hdu 1059 Dividing
- hdu 1059 Dividing
- hdu 1059 Dividing