HDOJ 1171 Big Event in HDU

   不是什么样的变形都不影响算法,吃一堑长一智,理解也更深一层,也算是好处多多吧~。根据母函数,①处循环的长度应当是随着所乘数的次方中未知量的最大值而不断变化的,但是很遗憾网上很多都是不变的,无法理解。

View Code
 1 //错误的解答   
2 //#include <fstream>
3 #include <iostream>
4 using namespace std;
5
6 bool money[250002];
7
8 unsigned value[52];
9 unsigned number[52];
10 int main()
11 {
12 //fstream cin("Big Event in HDU.txt");
13 int n;
14 while(cin>>n,n>=0)
15 {
16 memset(value,0,sizeof(value));
17 memset(number,0,sizeof(number));
18 int sum=0;
19 for(int i=1;i<=n;i++)
20 {
21 cin>>value[i]>>number[i];
22 sum+=value[i]*number[i];
23 }
24 int half=sum/2;
25 memset(money,0,sizeof(money));
26 for(int i=0;i<=number[1]*value[1];i+=value[1])
27 money[i]=true;
28 int len=number[1]*value[1];
29 for(unsigned i=2;i<=n;i++)
30 {
31 for(unsigned j=0;j<=len;j++)
32 for(unsigned k=0,s=0;s<=number[i];k+=value[i],s++)
33 if(money[j])
34 money[k+j]=true;//第二个循环内改变会影响后面的j值变化后的对money数据的使用
35 len+=number[i]*value[i];
36 }
37 while(half)
38 {
39 if(money[half])
40 {
41 cout<<sum-half<<" "<<half<<endl;
42 break;
43 }
44 half--;
45 }
46 }
47 return 0;
48 }

View Code
 1 //AC版本   
2 //#include <fstream>
3 #include <iostream>
4 using namespace std;
5
6 bool money[250002];
7 unsigned value[52];
8 unsigned number[52];
9 int main()
10 {
11 //ifstream cin("Big Event in HDU.txt");
12 int n;
13 while(cin>>n,n>=0)
14 {
15 memset(value,0,sizeof(value));
16 memset(number,0,sizeof(number));
17 int sum=0;
18 for(int i=1;i<=n;i++)
19 {
20 cin>>value[i]>>number[i];
21 sum+=value[i]*number[i];
22 }
23 memset(money,0,sizeof(money));
24 bool assistant[250002];
25 memset(assistant,0,sizeof(assistant));
26 for(int i=0;i<=number[1]*value[1];i+=value[1])
27 money[i]=true;
28 int len=number[1]*value[1];
29 for(unsigned i=2;i<=n;i++)
30 {
31 for(unsigned j=0;j<=len;j++)//
32 for(unsigned k=0;k<=number[i]*value[i];k+=value[i])
33 if(money[j])
34 assistant[k+j]=true;
35 len+=number[i]*value[i];//看了很多网上的代码,第二个循环的长度都没有变化,无法理解。
36 for(int j=0;j<=len;j++)
37 {
38 money[j]=assistant[j];
39 assistant[j]=false;
40 }
41 }
42 for(int i=sum/2;i>=0;i--)
43 if(money[i])
44 {
45 cout<<sum-i<<" "<<i<<endl;
46 break;
47 }
48 }
49 return 0;
50 }



posted on 2011-07-31 22:43  AdaByron  阅读(236)  评论(0编辑  收藏  举报

导航