POJ 1014 我连背包都不会了。。。囧。。。

View Code
 1 //Result:wizmann    1014    Accepted    824K    0MS    G++    1387B    

 2 #include <cstdio>

 3 #include <cstdlib>

 4 #include <cstring>

 5 #include <iostream>

 6 #include <algorithm>

 7 #include <bitset>

 8 

 9 using namespace std;

10 

11 #define print(x) cout<<x<<endl

12 #define input(x) cin>>x

13 #define SIZE 100000

14 

15 int array[12];

16 char dp[SIZE];

17 

18 //多重背包

19 //w - 重量  c - 费用  amount - 数量  v - 背包大小

20 //By Moody _"Kuuy"_ Wizmann

21 void CompletePack(int w,int c,int v) 

22 {

23     for(int i=0;i<=v;i++)  

24     {  

25         if(dp[i]) dp[i+w]=dp[i]+c;  

26     }

27 }

28 

29 void ZeroOnePack(int w,int c,int v)

30 {

31     for(int i=v;i>=0;i--)

32     {

33         if(dp[i] && i+w<=v) dp[i+w]=dp[i]+c;

34     }

35 }

36 

37 void MultiplePack(int w,int c,int amount,int v)

38 {

39     dp[0]=1;

40     if(w*amount>=v)

41     {

42         CompletePack(w,c,v);

43         return;

44     }

45     else

46     {

47         int k=1;  

48         while(k<amount)  

49         {  

50             ZeroOnePack(k*w,k*c,v);  

51             amount-=k;  

52             k<<=2;  

53         }

54         ZeroOnePack(amount*w,amount*c,v);

55     }

56 }  

57   

58 

59 int main()

60 {

61     freopen("input.txt","r",stdin);

62     int cas=1;

63     int sum=0;

64     while(1)

65     {

66         sum=0;

67         for(int i=1;i<=6;i++)

68         {

69             input(array[i]);

70             sum+=array[i]*i;

71         }

72         if(!sum) break;

73         print("Collection #"<<cas++<<":");

74 

75         if(sum%2) print("Can't be divided.");

76         else

77         {

78             memset(dp,0,sizeof(dp));

79             for(int i=1;i<=6;i++)

80             {

81                 MultiplePack(i,i,array[i],sum/2);

82                 if(dp[sum/2]) break;

83             }

84             

85             if(dp[sum/2]) print("Can be divided.");

86             else print("Can't be divided.");

87         }

88         puts("");

89     }

90     return 0;

91 }

92                 

93             

你可能感兴趣的:(poj)