解题思路:这题给人的第一反应是背包,第二反应是贪心,我用的是搜索,枚举就可以,要有这种意识,
题目数据只有8个,暴力是可以解决的。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int maxn = 10; 6 int v[maxn], vis[maxn]; 7 int va, vb, ans; 8 9 void DFS(int va, int vb, int cnt) 10 { 11 ans = max(ans, cnt); //ans记录最大的cnt 12 for(int i = 0; i < 8; i++) 13 { 14 if(!vis[i]) //用过的书是不能再用的 15 { 16 vis[i] = 1; 17 if(va >= v[i]) DFS(va-v[i], vb, cnt + 1);//心中要有一棵递归的树 18 if(vb >= v[i]) DFS(va, vb-v[i], cnt + 1); 19 vis[i] = 0; //这步绝对不能少,回溯。 20 } 21 } 22 return ; 23 } 24 25 int main() 26 { 27 while(~scanf("%d %d", &va, &vb)) 28 { 29 for(int i = 0; i < 8; i++) scanf("%d", &v[i]); 30 memset(vis, 0, sizeof(vis)); 31 ans = 0; 32 //sort(v, v + 8); //这步没影响,因为搜索枚举所有的情况。 33 DFS(va, vb, 0); 34 printf("%d ", ans); 35 } 36 return 0; 37 }