Hdu2660 Accepted Necklace【简单dfs】
http://acm.hdu.edu.cn/showproblem.php?pid=2660
题目大意:n个珠子里面找k个珠子,使得价值最大但重量不超过某一限定值。
直接对要不要第i颗珠子进行dfs,搜索过程中注意剪枝。
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <set> #include <map> #include <cmath> #include <queue> using namespace std; template <class T> void checkmin(T &t,T x) {if(x < t) t = x;} template <class T> void checkmax(T &t,T x) {if(x > t) t = x;} template <class T> void _checkmin(T &t,T x) {if(t==-1) t = x; if(x < t) t = x;} template <class T> void _checkmax(T &t,T x) {if(t==-1) t = x; if(x > t) t = x;} typedef pair <int,int> PII; typedef pair <double,double> PDD; typedef long long ll; #define foreach(it,v) for(__typeof((v).begin()) it = (v).begin(); it != (v).end ; it ++) const int N = 22; int a[N] , b[N]; int n , K , ans; int accept; void dfs(int id,int vn,int wn,int k) { if(id > n || wn > accept) return; if(k+n-id+1 < K) return; if(id == n + 1) { if(k == K) checkmax(ans , vn); return; } if(k == K) checkmax(ans , vn); dfs(id+1,vn+a[id],wn+b[id],k+1); dfs(id+1,vn,wn,k); } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&K); for(int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]); scanf("%d",&accept); ans = -1; dfs(0,0,0,0); printf("%d\n" , ans); } return 0; }