POJ 3628 Bookshelf 2 0-1背包 or DFS 水题
我竟然做了一题水题,浪费我感情啊,5分钟内2个AC(还是1A);
1.0-1背包
View Code
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int w[22]; bool dp[20000000]; int main() { int n, m, i, j, b; while(~scanf("%d%d",&n,&b)) { m=0; for(i=1;i<=n;i++) scanf("%d",&w[i]),m+=w[i]; for(i=1;i<=m;i++) dp[i]=0; dp[0]=1; for(i=1;i<=n;i++) { for(j=m;j>=w[i];j--) if(dp[j-w[i]])dp[j]=1; } for(i=b;i<=m;i++) if(dp[i]){printf("%d\n",i-b);break;} } return 0; }
2.DFS
View Code
#include<stdio.h> #include<algorithm> using namespace std; int a[22], minn,n, b, s; void dfs(int pos, int sum) { if(sum>=b)minn=min(minn,sum); int i; for(i=pos;i<n;i++) { dfs(i+1,sum+a[i]); } } int main() { int i, j; while(~scanf("%d%d",&n,&b)) { s=0; for(i=0;i<n;i++) scanf("%d",&a[i]),s+=a[i]; minn=s; dfs(0,0); printf("%d\n",minn-b); } return 0; }


浙公网安备 33010602011771号