hdu2660---Accepted Necklace解題報告(DFS+剪枝)
阿新 • • 發佈:2018-11-05
Accepted Necklace題目連結
輸入:
測試資料:T
寶石數目n, 強制寶石K塊組成
n塊寶石的價值+重量
最大可以接受的重量max_w
題意:用n種不同價值和重量的寶石拼成一塊,由K塊寶石組成的,重量不超過max_w的,價值最大的項鍊
DFS日刷:
這題需要剪枝,不然會超時,cin也會超時。
Code:
#include<iostream> #include<sstream> #include<cstdlib> #include<cmath> #include<algorithm> #include<cstring> #include<cstdio> #include<map> #include<vector> #include<stack> #include<queue> #include<set> #include<list> #define mod 998244353 #define INF 0x3f3f3f3f #define Min 0xc0c0c0c0 #define mst(a) memset(a,0,sizeof(a)) #define f(i,a,b) for(int i = a; i < b; i++) using namespace std; typedef long long ll; const int MAX_N = 1e6 + 5; int n, k, max_w, max_v; struct Node{ int val, wei; }arr[25]; void dfs(int cur_n, int cur_v, int cur_w, int sum){ //cur_n表示遍歷第i塊寶石,cur_v表示當前寶石價值 // cur_w表示當前重量 sum表示實際取的寶石數量 if(n - cur_n < k - sum || cur_w > max_w) return; //剪枝 if(sum == k){ max_v = max(max_v, cur_v); return; } dfs(cur_n + 1, cur_v + arr[cur_n].val, cur_w + arr[cur_n].wei, sum + 1); dfs(cur_n + 1, cur_v, cur_w, sum); return; } int main(){ //freopen("c1.txt", "w", stdin); //freopen("c2.txt", "r", stdout); //ios::sync_with_stdio(false); int T; scanf("%d", &T); while(T--){ scanf("%d%d", &n, &k); for(int i = 0; i < n; i++){ scanf("%d%d", &arr[i].val, &arr[i].wei); } scanf("%d", &max_w); max_v = -9999; dfs(0, 0, 0, 0); printf("%d\n", max_v); } //fclose(stdin); //fclose(stdout); return 0; }