发疯的_小男孩吧 关注:103贴子:1,251
  • 11回复贴,共1

【算法学习】动态规划之01背包问题

只看楼主收藏回复

问题描述:
给定N中物品和一个背包。物品i的重量是Wi,其价值位Vi ,背包的容量为C。问应该如何选择装入背包的物品,使得转入背包的物品的总价值为最大??
在选择物品的时候,对每种物品i只有两种选择,即装入背包或不装入背包。不能讲物品i装入多次,也不能只装入物品的一部分。因此,该问题被称为0-1背包问题。
01背包的状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ), f[i-1,j] }f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值。
Pi表示第i件物品的价值。
决策:为了背包中物品总价值最大化,第 i件物品应该放入背包中吗 ?


IP属地:广西1楼2016-10-11 12:58回复
    用maple写了一个递归程序,感觉运行速度还可以。
    代码:
    f:=proc(w,v,N,W)
    local i,j,CE,n;
    n:=nops(w);
    f(w,v,0,W):=0;
    f(w,v,1,0):=0;
    j:=N;
    if W<w[j] then
    f(w,v,j,W):=f(w,v,j-1,W);
    elif W>=w[j] then
    if j-1=0 or W-w[j]=0 then
    f(w,v,j,W):=max(0,0+v[j]);
    else
    f(w,v,j,W):=max(f(w,v,j-1,W),f(w,v,j-1,W-w[j])+v[j]);
    fi:
    fi:
    return(f(w,v,N,W));
    end proc:
    运行实例:


    IP属地:广西2楼2016-10-11 13:04
    回复
      测试数据:
      (1)
      物品个数50 体积1000
      单个价值220 208 198 192
      180 180 165 162 160 158 155 130 125 122 120 118 115
      110 105 101 100 100 98 96 95 90 88 82 80 77 75 73 72
      70 69 66 65 63 60 58 56 50 30 20 15 10 8 5 3 1
      单个体积80 82 85 70 72 70 66 50 55 25 50 55 40 48
      50 32 22 60 30 32 40 38 35 32 25 28 30 22 50 30 45 30
      60 50 20 65 20 25 30 10 20 25 15 10 10 10 4 4 2 1
      最优解:3103


      IP属地:广西3楼2016-10-11 13:06
      回复
        (3)
        数目100 总体积6718
        价值597 596 593 586 581 568 567 560 549 548 547 529 529 527 520 491 482 478 475 475 466 462 459 458 454 451 449 443 442 421 410 409 395 394 390 377 375 366 361 347 334 322 315 313 311 309 296 295 294 289 285 279 277 276 272 248 246 245 238 237 232 231 230 225 192 184 183 176 174 171 169 165 165 154 153 150 149 147 143 140 138 134 132 127 124 123 114 111 104 89 74 63 62 58 55 48 27 22 12 6
        体积54 183 106 82 30 58 71 166 117 190 90 191 205 128 110 89 63 6 140 86 30 91 156 31 70 199 142 98 178 16 140 31 24 197 101 73 169 73 92 159 71 102 144 151 27 131 209 164 177 177 129 146 17 53 164 146 43 170 180 171 130 183 5 113 207 57 13 163 20 63 12 24 9 42 6 109 170 108 46 69 43 175 81 5 34 146 148 114 160 174 156 82 47 126 102 83 58 34 21 14
        最优解 P=26559


        IP属地:广西5楼2016-10-11 13:07
        回复
          随机生成了容量1000的数据测试了一下:
          数目:1000 总体积:20000
          价值:[139 184 67 135 180 188 77 166 183 177 127 85 186 105 156 78 96 140 181 110 126 158 91 145 183 163 154 63 144 157 73 84 134 169 90 99 64 100 65 196 146 126 174 120 181 194 94 69 104 128 111 153 68 104 121 60 68 168 138 69 143 111 159 108 137 192 153 178 200 164 150 181 172 173 163 156 94 182 79 179 125 145 184 75 131 127 86 150 149 85 159 93 187 144 118 139 122 69 136 108 196 187 191 88 142 78 200 65 196 186 106 170 92 91 97 152 108 79 117 194 124 84 181 141 171 129 136 168 193 192 174 122 88 134 80 137 101 98 142 78 114 69 82 70 80 196 147 132 187 169 151 183 108 187 121 122 89 138 138 126 154 123 164 181 142 163 105 180 138 94 65 123 188 153 174 81 61 173 193 101 185 140 127 182 158 65 83 149 60 156 63 127 120 200 94 145 138 84 93 84 198 64 186 198 73 106 190 151 186 92 122 136 87 182 72 88 99 95 193 179 65 198 162 84 120 119 76 118 149 81 149 162 92 86 104 185 147 60 159 200 102 165 109 128 70 163 178 100 144 189 102 189 64 176 92 87 164 144 156 150 60 171 179 153 89 74 181 101 85 74 199 159 77 137 99 162 76 75 78 184 162 158 161 105 122 161 70 72 78 104 119 123 152 113 113 113 198 85 71 71 72 87 152 78 198 185 194 158 85 159 183 103 186 145 74 113 126 158 157 181 106 173 165 143 184 184 143 150 141 161 196 199 200 143 143 96 96 111 175 159 84 97 106 193 192 121 166 116 184 84 121 150 161 72 122 140 194 86 182 142 132 84 166 116 91 64 63 110 193 112 80 169 165 128 191 145 96 159 69 177 133 83 173 120 90 133 67 95 145 190 101 64 192 102 166 173 116 120 144 166 177 187 167 163 102 160 192 174 65 100 175 77 158 173 148 147 146 164 167 143 196 103 104 197 141 77 110 135 118 64 194 147 134 183 98 134 107 116 97 123 94 179 111 100 95 133 124 198 104 136 86 104 188 74 64 197 148 110 77 116 98 164 122 74 77 105 104 192 108 130 106 87 94 148 86 89 151 191 141 200 186 133 111 73 108 82 177 144 116 159 64 149 149 79 125 197 177 70 63 132 181 171 196 154 152 140 152 190 114 150 116 118 73 90 100 77 93 199 99 76 158 98 133 97 97 68 199 165 167 73 76 128 100 156 176 178 101 120 132 120 80 102 87 81 148 85 75 157 121 146 89 126 139 106 73 127 139 177 120 113 71 92 178 104 90 107 138 180 158 62 126 118 165 158 109 143 68 89 81 151 86 112 197 144 123 195 156 79 173 75 184 130 195 140 61 159 71 74 83 118 159 75 86 134 120 185 112 195 168 161 142 175 184 172 160 151 85 113 184 66 100 191 145 184 178 169 62 151 101 72 112 189 62 113 128 158 111 193 191 118 103 83 130 61 98 194 144 179 179 153 159 188 186 170 117 99 111 169 142 197 95 199 60 180 113 147 144 80 66 100 149 90 115 149 63 178 184 80 72 136 192 126 70 159 82 86 155 104 115 166 163 157 71 86 199 182 78 88 75 172 93 95 82 165 127 109 146 142 165 97 74 193 154 148 91 155 116 120 118 134 131 122 160 139 73 105 199 177 125 71 93 117 192 167 75 153 105 93 197 101 187 107 179 168 71 130 84 151 174 112 176 68 168 96 149 82 68 97 184 179 198 110 159 114 132 72 145 116 96 131 161 105 116 173 131 199 200 138 82 195 144 169 96 153 125 114 132 162 99 187 94 73 111 167 93 95 76 128 188 185 164 106 166 64 65 179 91 94 127 179 172 122 82 172 72 182 139 135 88 112 198 169 151 76 133 110 119 173 74 93 162 160 87 141 113 151 86 89 124 178 88 99 71 121 182 192 113 104 152 119 183 178 154 174 79 169 131 120 199 77 135 76 166 149 103 147 63 120 155 164 112 111 98 78 176 200 68 122 64 184 174 135 108 68 178 182 84 88 190 132 181 141 83 134 119 196 107 108 87 190 68 100 106 143 168 65 63 113 101 156 86 67 70 167 126 132 92 105 73 88 183 153 112 96 106 91 104 88 83 60 194 68 86 175 117 197 62 144 84 83 163 75 194 155 120 125 77 107 93 102 66 163 171 97 130 91 179 127 137 77 78 78 172 155 114 138 71 177 144 100 118 101 178 191 167 71 129 180 103 88 105 187 179 121 65 79 167 174 123 88 163 130 151 196 71 94 141 131 102 61]


          IP属地:广西7楼2016-10-11 13:23
          回复
            师傅好久不见呀


            IP属地:广东来自Android客户端11楼2016-11-01 22:46
            回复