标签:sam algorithm php 输出 zoj geo 特定 范围 开始
1 for(int j=i;j;j=(j-1)&i) 2 { 3 if(sum[j]<=W) f[i]=min(f[i],ti[j]+f[i^j]); 4 }
j枚举出来就是i的所有子集。因此,我们还得预处理出来所有状态的总重量以及时间。然后就相当好搞了。据说复杂度可以证明为3^n。
1 #include <iostream> 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cstring> 5 #include <algorithm> 6 #include <cmath> 7 #include <queue> 8 #include <map> 9 #include <set> 10 #include <vector> 11 #define N 20 12 using namespace std; 13 int f[1<<17]; 14 int n,t[N],w[N],W; 15 int sum[1<<17],ti[1<<17]; 16 int main() 17 { 18 scanf("%d%d",&W,&n); 19 for(int i=1;i<=n;i++) 20 { 21 scanf("%d%d",&t[i],&w[i]); 22 } 23 memset(f,0x7f,sizeof(f)); 24 f[0]=0; 25 for(int i=1;i<(1<<n);i++) 26 { 27 for(int j=1;j<=n;j++) 28 { 29 if((1<<(j-1))&i) 30 { 31 sum[i]+=w[j]; 32 ti[i]=max(ti[i],t[j]); 33 } 34 } 35 } 36 for(int i=1;i<(1<<n);i++) 37 { 38 for(int j=i;j;j=(j-1)&i) 39 { 40 if(sum[j]<=W) f[i]=min(f[i],ti[j]+f[i^j]); 41 } 42 } 43 printf("%d\n",f[(1<<n)-1]); 44 return 0; 45 }
标签:sam algorithm php 输出 zoj geo 特定 范围 开始
原文地址:http://www.cnblogs.com/liutianrui/p/7749257.html