hdu 3448Bag Problem
- -由于本人是极其水的水鸟,做此题是用DP过了样列
可惜过不了OJ,于是狠下心来,上网抄了一段代码,改了一下,终于出现了本人的第一次用DFS做题
(抄的还说自己的,不要面啊= =)
同时也对代码做了注释和分析,希望水鸟们早日高飞~
读题,K个物块,每个只能取一次(擦,我一开始以为无限取的。。。),求最接近M重量的背包。
这题有两个限定量,
还有一个就是背包只可以装N个物体,另外就是不能超过M值了。
不废话了,剩下的靠你自己领悟DFS的写法了
1 #include<iostream>
2 using namespace std;
3 int n,m,k; //n代表可带数量物块数量
4 int wi[60]; //m代表最大可背重量,k就是有k个物块
5 int cnt; //wi就是每个物件的总量,cnt是记录体
6 int i;
7 int max(int i,int j)
8 {
9 if(i>j) return i;
10 else return j;
11 }
12 void dfs(int id,int num,int weight)
13 {
14 cnt =max(cnt ,weight); //外源记忆最大可背重量
15 if(id==k) return ; //如果已经搜到第K个石头,结束。
16 dfs(id+1,num,weight); //检查下一个ID石块
17 if(weight+wi[id]<=m&&num+1<=n)
18 dfs(id+1,num+1,weight+wi[id]);
19 }
20 //id是检查到的物块的ID,num记录目前已带物块数量
21 int main()
22 {
23 while(scanf("%d%d",&n,&m)==2)
24 {
25 scanf("%d",&k);
26 int tsum;
27 for(int i=0;i<k;i++)
28 {
29 scanf("%d",&wi[i]);
30
31 }
32 //排序
33 int tras;
34 for(i=0;i<k;i++)
35 {
36 for(tsum=i+1;tsum<k;tsum++)
37 {
38 if(wi[i]>wi[tsum])
39 {
40 tras=wi[i];wi[i]=wi[tsum];wi[tsum]=tras;
41 }
42 }
43 }
44 //
45 tsum=0;
46
47 for(i=k-1;i>=k-n;i--)
48 tsum+=wi[i];
49 if(wi[0]>m)
50 tsum=0;
51 if(tsum<=m)
52 {
53 printf("%d\n",tsum);
54 continue;
55 }
56 cnt=0;
57 dfs(0,0,0);
58 printf("%d\n",cnt);
59 }
60 return 0;
61 }
别人的代码还在最后加TSUM变量来剪枝,虽然只是剪一个,但也好过没有嘛~~~~
posted on 2012-03-30 16:44 笨-Archangel 阅读(290) 评论(0) 收藏 举报
浙公网安备 33010602011771号