充气

本文介绍了一个寻找最优装载策略的算法实现,通过排列不同重量和体积的物品,寻找能在限定容量内达到最小起始点的方案。该算法首先进行全排列尝试,然后采用两种不同的优化方法确定最小值。
  1 #include <iostream>
  2 using namespace std;
  3 #define SIZE 5
  4 #define Limit 150
  5 int a[SIZE]={35,105,100,45,75};
  6 int b[SIZE]={115,75,55,35,105};
  7 int a1[SIZE];
  8 int b1[SIZE];
  9 int c[SIZE]={1,2,3,4,5};
 10 int c1[SIZE];
 11 int minnum=Limit+1;
 12 void minqi1(int chong[SIZE],int fang[SIZE]);
 13 void minqi(int chong[SIZE],int fang[SIZE]);
 14 void quanpai(int n);
 15 int main()
 16 {
 17     quanpai(0);
 18     if(minnum==Limit+1)
 19     {
 20         cout <<"无最佳"<<endl;
 21     }
 22     else
 23     {
 24         cout <<minnum<<endl;
 25     }
 26     return 0;
 27 }
 28 bool safe(int num,int n)
 29 {
 30     bool ret=true;
 31     for(int i=0;i<n;i++)
 32     {
 33         if(c1[i]==num)
 34             ret=false;
 35     }
 36     return ret;
 37 }
 38 
 39 void quanpai(int n)
 40 {
 41     if(n==SIZE)
 42     {
 43         minqi1(a1,b1);
 44         return;
 45     }
 46     for(int i=0;i<SIZE;i++)
 47     {
 48         a1[n]=a[i];
 49         b1[n]=b[i];
 50         c1[n]=c[i];
 51         if(safe(c1[n],n))
 52         {
 53             quanpai(n+1);
 54         }
 55     }
 56 }
 57 void minqi(int chong[SIZE],int fang[SIZE])
 58 {
 59     int i=0;
 60     int j=0;
 61     while(i>=0&&i<=Limit)
 62     {
 63         int qi=i;
 64         
 65         for(j=0;j<SIZE;j++)
 66         {
 67             if(qi+chong[j]>Limit)
 68                 break;
 69             if(qi+chong[j]-fang[j]<0)
 70                 break;
 71             qi+=chong[j]-fang[j];
 72         }
 73         if(j==SIZE)
 74             break;
 75         i++;
 76     }
 77     if(j==SIZE&&i<=Limit&&i<minnum)
 78         minnum=i;
 79 }
 80 
 81 
 82 void minqi1(int chong[SIZE],int fang[SIZE])
 83 {
 84     int cha[SIZE]={0};
 85     int k=0;
 86     int j=0;
 87     int mins=0;
 88     int max=0;
 89     
 90     for(int i=0;i<SIZE;i++)
 91     {
 92         j=k+chong[i];
 93         k=k+chong[i]-fang[i];
 94         cha[i]=k;
 95         if(cha[i]<mins)
 96         {
 97             mins=cha[i];
 98         }
 99         if(j>max)
100         {
101             max=j;
102         }
103     }
104     if(mins<0)
105     {
106         mins=-mins;
107     }
108     if(mins<minnum&&mins+max<=Limit)
109         minnum=mins;
110 }
111         

 

转载于:https://www.cnblogs.com/jintg/p/6347109.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值