http://poj.org/problem?id=3628
题意:现有一个书架,N头牛,农场主想把这些牛放在书架上,当然,书架是有固定的高度的。现在问你在这些牛之中,其中一些牛的高度加在一块比书架高的最小差值是多少?
分析:
两种方法:(1)01背包,算得所有牛的高度,然后dp一遍,再找比书架高的最小值,两数相减即可。
(2)DFS,DFS(牛的坐标, 牛高度的总和),若在DFS过程中,牛高度的总和>=书架高度,则可以求我们所需要的值
01背包:
#include<stdio.h> #include<math.h> #include<string.h> #include<ctype.h> #include<stdlib.h> #include <iostream> #include<algorithm> #include<queue> #define maxn 1100 #define oo 0x3f3f3f3f using namespace std; int dp[maxn*maxn], w[maxn]; int main() { int n, m; while(scanf("%d %d", &n, &m)!=EOF) { int sum = 0; for(int i=1; i<=n; i++) { scanf("%d", &w[i]); sum += w[i]; } memset(dp, 0, sizeof(dp)); for(int i=1; i<=n; i++) { for(int j=sum; j>=w[i]; j--) { dp[j]=max(dp[j], dp[j-w[i]]+w[i]); } } int mins = oo; for(int i=1; i<=sum; i++) { if(dp[i]>=m) { mins=min(mins, dp[i]-m); } } printf("%d\n", mins); } return 0; }
DFS:
#include<stdio.h> #include<math.h> #include<string.h> #include<ctype.h> #include<stdlib.h> #include <iostream> #include<algorithm> #include<queue> #define maxn 1100 #define oo 0x3f3f3f3f using namespace std; int a[maxn], v[maxn]; int n, m, mins; void DFS(int x, int sum) { if(sum >= m) { mins=min(mins, sum-m); return ; } if(x>n || mins==0) return ; for(int i=x; i<=n; i++) { if(!v[i]) { v[i] = 1; DFS(i+1, sum+a[i]); v[i] = 0; } } } int main() { while(scanf("%d %d", &n, &m)!=EOF) { for(int i=1; i<=n; i++) scanf("%d", &a[i]); memset(v, 0, sizeof(v)); mins = oo; DFS(1, 0); printf("%d\n", mins); } return 0; }
时间: 2024-10-01 18:26:03