标签:
题目链接:http://acm.swust.edu.cn/problem/465/
170 7
1 70
2 50
3 30
4 40
5 40
6 30
7 20
1 4
1 7
3 4
3 5
5 7
6 7
0 0
|
4 160
2
4
5
6
|
1 /******************0-1背包+dfs******************/ 2 #include <iostream> 3 using namespace std; 4 5 #define rep(i,a,b) for(int i=a;i<=b;i++) 6 7 int buy[31], sign[31];//sign标记鱼的购买状态,buy最优购买方案 8 int mpt[31][31];//表示鱼的相互克制状态 9 int val, num, n, m, vi[31];//vi价格 10 11 void dfs(int cur, int sum, int cnt){ 12 int ptr[31];//中转变量 13 if (cur > n){ 14 if (num<cnt || (num == cnt&&sum>val)){ 15 num = cnt; 16 val = sum; 17 rep(i, 1, n)buy[i] = sign[i]; 18 } 19 return; 20 } 21 if (!sign[cur] && sum + vi[cur] <= m){ 22 rep(i, 1, n) ptr[i] = sign[i]; 23 sign[cur] = 2;//标记这条鱼已购买 24 rep(i, 1, n){ 25 if (mpt[cur][i] && !sign[i]) 26 sign[i] = 1; 27 } 28 dfs(cur + 1, sum + vi[cur], cnt + 1); 29 //还原鱼的购买状态,方便下一次搜索 30 rep(i, 1, n) sign[i] = ptr[i]; 31 sign[cur] = 0; 32 } 33 dfs(cur + 1, sum, cnt); 34 } 35 int main(){ 36 int a, b; 37 cin >> m >> n; 38 //鱼不一定按顺序给出,坑爹啊~~ 39 rep(i, 1, n){ 40 cin >> a; 41 cin >> vi[a]; 42 } 43 cin >> a >> b; 44 while (a || b){ 45 mpt[a][b] = mpt[b][a] = 1; 46 cin >> a >> b; 47 } 48 dfs(1, 0, 0); 49 cout << num << ‘ ‘ << val <<endl; 50 rep(i, 1, n){ 51 if (buy[i] == 2) 52 cout << i << endl; 53 } 54 return 0; 55 }
[Swust OJ 465]--吴奶奶买鱼(0-1背包+dfs)
标签:
原文地址:http://www.cnblogs.com/zyxStar/p/4589246.html