码迷,mamicode.com
首页 > 其他好文 > 详细

动态规划三:0-1背包问题

时间:2014-12-12 20:49:29      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   ar   color   os   sp   for   on   

  1.问题描述:

  一定的物体和一背包,物体i的重量为wi价值为vi,背包的容量为c,求解怎样放使背包的价值最大?则问题可描述为:

bubuko.com,布布扣

  

  

 

 

 

  2.问题分析:

  1)最优子结构:

  bubuko.com,布布扣bubuko.com,布布扣

  其中j=c-wiyi

  2)递归关系:设最优值为m(i,j),j表示最优容量,i表示可选物品,由最优子结构性质可建立递归式:

  bubuko.com,布布扣

  bubuko.com,布布扣

  3.算法描述:(未优化)

 1 #include<iostream>
 2 using namespace std;
 3 int c[10][100];
 4 int Knap(int m, int n){
 5     int w[10];
 6     int v[10];
 7     cout << "输入物体重量w和价值v:\n";
 8     for (int i = 1; i <= n; i++){
 9         cin >> w[i] >> v[i];
10     }
11     for (int i = 1; i <= n; i++)
12     {
13         for (int j = 1; j <= m; j++)//背包的容量则逐一测试
14         {
15             if (w[i] <= j)
16             {
17                 if (c[i - 1][j] < v[i] + c[i - 1][j - w[i]])
18                     c[i][j] = v[i] + c[i - 1][j - w[i]];
19                 else
20                     c[i][j] = c[i - 1][j];
21             }
22             else
23                 c[i][j] = c[i - 1][j];
24         }
25     }
26     return c[n][m];
27 }
28 
29 int main(){
30     int n, m;
31     cout << "输入物体数n和背包容量m:\n";
32     cin >> n >> m;
33     cout << Knap(n, m)<<endl;
34     for (int i = 0; i <= n; i++)
35     {
36         for (int j = 0; j <= m; j++)
37             cout<<c[i][j];
38         cout<<endl;
39     }
40     return 0;
41 }

 

 

  

动态规划三:0-1背包问题

标签:style   blog   io   ar   color   os   sp   for   on   

原文地址:http://www.cnblogs.com/xp12/p/4159762.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!