ZOJ 3631 Watashi's BG(01dp)
01dp不过由于数组过于大,开不开,学了搜索过了,先记录下 还有一种方法
#include<stdio.h> #include<algorithm> using namespace std; const int MAXN=10000010; int a[MAXN]; int n,m,ans; bool cmp(int a,int b) { return a>b; } int max(int a,int b) { return a>b?a:b; } void DFS(int s,int num) { if(s>m) return ; if(num>=n) // { ans=max(s,ans); return ; } int temp=s; for (int i=num;i<n;i++)//若后面的所有数都加进去还比最大的小,就不用比较了 temp+=a[i]; if(temp<ans) return; /*01背包的精髓,放与不放*/ DFS(s+a[num],num+1); DFS(s,num+1); } int main() { while(scanf("%d%d",&n,&m)!=EOF) { ans=0; for (int i=0;i<n;i++) scanf("%d",&a[i]); sort(a,a+n,cmp);//剪枝 DFS(0,0); printf("%d\n",ans); } return 0; }