[hdoj2260]Difficulty control(dfs) 发表于 2019-03-06 | 分类于 dfs | 热度: ℃ Difficulty Control题意中文题目不说了。 题解dfs+剪枝 剩下的加不到最优值剪掉 已经加过了最优值剪掉 我在大二的时候TLE了20次的题目终于在队友的指导之下完成了。 ac代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061#include<bits/stdc++.h>using namespace std;#define rep(i,a,n) for(int i=(a);i<(n);i++)#define per(i,a,n) for(int i=(n-1);i>=(a);i--)#define fi first#define se secondtypedef pair <int,int> pII;typedef long long ll;const int INF = 0x3f3f3f3f;//headll n,m;const int maxn = 30;ll num[maxn];vector<int> ve;ll ans = INT_MAX;int tans[maxn];int temp[maxn];void dfs(int x,ll now){ if(abs(now-m) < ans && x == n){ ans = abs(now-m); memcpy(tans,temp,sizeof(temp)); } ll tt = 0; if(now-m > ans) return; rep(i,x,n) tt += num[ve[i]]; if(tt + now + ans < m ) return ; if(x==n) { return ; } temp[ve[x]] = 1; dfs(x+1,now + num[ve[x]]); temp[ve[x]] = 0; dfs(x+1,now);}int main(){#ifdef LOCAL freopen("1.in","r",stdin);#endif while(cin>>n>>m){ ve.clear(); memset(temp,0,sizeof(temp)); memset(tans,0,sizeof(tans)); rep(i,0,n){ ll x; char ch; cin>>ch>>x; ve.push_back(ch-'A'); num[ch-'A'] = x; } sort(ve.begin(),ve.end()); ans = INT_MAX; dfs(0,0); vector<int> reans; rep(i,0,26) if(tans[i]) reans.push_back(i+'A'); int len = reans.size(); printf("%d\n",len); rep(i,0,len){ printf("%c%c",reans[i],i==len-1?'\n':' '); } } return 0;} 本文作者: CheaSim 本文链接: https://www.cheasim.com/dfs/2019/03/06/hdoj2260-Difficulty-control-dfs.html 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!