华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 840|回复: 0
打印 上一主题 下一主题

经典背包问题

[复制链接]

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
跳转到指定楼层
楼主
发表于 2018-6-3 12:03:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
假设有5个物品,重量分别是 4 7 8 9 3,价值分别是5 8 10 13 4,能不能在重量不超过x的情况下得到价值的最大值。

  1. #include<iostream>
  2. #include<iomanip>
  3. using namespace std;
  4. int w[6]= {0,4,7,8,9,3}; //假设有5个物品
  5. int v[6]= {0,5,8,10,13,4};
  6. int f[105][6]; //f[x][y] 表示重量不超过x时最大的价值
  7. int g[105];
  8. int i,j;
  9. int t1,t2,t;
  10. int main()
  11. {
  12.     cout<<"\n========way1=========\n";

  13.     for(i=1; i<=5; i++)
  14.         for (j=0; j<=100; j++)
  15.         {
  16.             if (j>=w[i])  ///这样写很清晰吧!
  17.             {
  18.                 t1=f[j-w[i]][i-1]+v[i];
  19.                 t2=f[j][i-1];
  20.                 t=max(t1,t2);
  21.             }
  22.             else t=f[j][i-1];
  23.             f[j][i]=t;
  24.         }

  25.     for (i=1; i<=5; i++)
  26.     {

  27.         for (j=0; j<=13; j++) cout<<setw(4)<<f[j][i];
  28.         cout<<'\n';
  29.     }


  30.     cout<<"\n========way2=========\n";
  31.     g[0]=0;
  32.     for (i=1; i<=5; i++)
  33.     {
  34.         for (j=100; j>=w[i]; j--)
  35.         {
  36.             if (j>=w[i])
  37.             {
  38.                 t1=g[j-w[i]]+v[i];
  39.                 t2=g[j];
  40.                 t=max(t1,t2);
  41.             }
  42.             g[j]=t;

  43.         }
  44.         for (j=0; j<=13; j++) cout<<setw(4)<<g[j];
  45.         cout<<endl;
  46.     }
  47.     return 0;
  48. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-2 06:34 , Processed in 0.099403 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表