在 @2018肖伟文 的博客里,提到了一种搜索+剪枝解决零一背包的思路,并给出了两个剪枝方案。
首先,在你没思路的时候, 这两个剪枝方案是很有用的,尤其是CSP赛前我们可能确实需要这方面的技巧。
但是,由于作者没有对这两种剪枝的复杂度进行解析,实际上它们即使剪了枝,复杂度仍然为指数级,别说 n≤103 了,连本题的范围其实搜索都过不了。
不过作者想到了剪枝方案2比剪枝方案1更难卡,至少在我的水平下:剪枝1我能卡成 O(2N),但是剪枝2我只能卡成 O(2min{N,T})。
下面我分别给出两种剪枝方案对应的一种卡法,望管理加入数据:
#include<bits/stdc++.h>
using namespace std;
int n=100,t=1000;
int main(){
printf("%d %d\n",t,n);
for(int i=1;i<n;i++)printf("%d %d\n",2,2);
printf("%d %d",t-1,4*n);
return 0;}
#include<bits/stdc++.h>
using namespace std;
int n=100,t=1000;
int main(){
printf("%d %d\n",t,n);
for(int i=1;i<n;i++)printf("%d %d\n",i,i);
printf("%d %d",t-1,n-1);
return 0;}