Ay's Blog@CNSSUESTC

学校的数据结构试验题目一 背包问题

题目如下,解法可能不是最好的  若有更好解法  请赐教 
初学算法~望多多指教啊~~

c.bmp
解法:


  1
 
  2 
  3 #include <iostream>
  4 #include <windows.h>
  5 
  6 #define MAXINPUT 15
  7 
  8 using namespace std ;
  9 
 10 struct stack {
 11     int *data ;
 12     stack *next ;
 13 } ;
 14 
 15 
 16 
 17 stack *push(stack *top , int *data )   //压栈
 18 {
 19     stack *tem =  new stack ;
 20     
 21     tem->data = data ;
 22 
 23     tem->next = top ;
 24 
 25     return tem ;
 26 }
 27 
 28 stack *pop(stack *top , int **data)   //出栈
 29 {    
 30     if( top == NULL)
 31         return top ;
 32     stack *tem ;
 33 
 34     tem = top ;
 35 
 36     *(data) = tem->data ;
 37 
 38     top = top->next ;
 39 
 40     delete tem ;
 41 
 42     return top ;
 43 }
 44 
 45 void stackprint(stack *top)  //打印栈内容
 46 {
 47     while(1)
 48     {
 49     
 50     if( top == NULL )
 51         break ;
 52 
 53     cout<<*(top->data)<<" " ;
 54     
 55     top = top->next ;
 56     
 57     }
 58 
 59     cout<<endl ;
 60 }
 61 
 62 
 63 
 64 int sum = 0 , input[MAXINPUT] = {0}  ;
 65 
 66 int main(void)
 67 {
 68     int count = 0 , T = 0 ;
 69 
 70     cout<<"请输入T值"<<endl ;
 71     cin>>T ;
 72 
 73     cout<<"请输入w数组数目"<<endl ;
 74     cin>>count ;
 75     
 76     if( count > MAXINPUT )
 77     {
 78         cout<<"输入溢出"<<endl ;
 79         return 1 ;
 80     }
 81 
 82     forint i = 0 ; i < count ; i++ )
 83     {
 84         cout<<"请输入w["<<i<<"]值"<<endl ;
 85         cin>>input[i] ;
 86     }
 87 
 88     cout<<endl<<"Loading"<<endl ;
 89     
 90 
 91 
 92     stack *top = NULL ;  //初始化栈
 93 
 94     int i = 0  , *temdata = input , *popdata = input , *enddata = &input[count]  ;
 95 
 96     /*
 97     栈的非递归调用,
 98     先压栈数据,然后依次遍历剩余的数据,满足条件打印,小于预期值就压栈
 99     接着遍历剩余数据,遍历这个层次的数据完了就出栈,然后指针+1(指向下一个数据),继续遍历剩余数据
100     */
101     
102     while(1)
103     {
104         sum += *temdata ;
105         
106         top = push(top , temdata) ;
107     
108         if( sum == T )
109         {
110             stackprint(top) ;
111             top = pop(top,&popdata) ;
112             sum -= *popdata ;
113             top = pop(top , &popdata ) ;
114             sum -= *popdata ;
115             temdata = ++popdata ;        
116         
117         }
118         else if (sum > T )
119         {
120             top = pop(top,&popdata) ;
121             sum -= *popdata ;
122             temdata = ++popdata ;
123         }
124         else if( sum<T )
125         {
126             temdata = ++popdata ;
127         }
128 
129         if( (temdata-1== enddata )
130         {
131             top = pop(top,&popdata) ;
132             sum -= *popdata ;            
133             top = pop(top,&popdata) ;
134             sum -= *popdata ;
135 
136             temdata = ++popdata ;
137         }
138     
139         if( top == NULL &&  popdata == enddata)
140                 break ;
141     
142     }
143 
144 
145 
146     
147     system("pause") ;
148 
149     return 1;
150 
151 }
152 
153 
154 


posted on 2008-12-09 14:36 __ay 阅读(339) 评论(0)  编辑 收藏 引用 所属分类: 算法 && C/C++


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理