买橘子

【题目】
小明去附近的水果店买橙子,水果商贩只提供整袋购买,有每袋6个和每袋8个的包装(包装不可拆分)。可是小明只想购买恰好n个橙子,并且尽量少的袋数方便携带。如果不能购买恰好n个橙子,小明将不会购买。
【输入】购买的橙子数
【输出】袋数,不能购买-1
【思路】动态规划,i个橙子最少要DP[i]个袋子
1. 先将DP[i]置-1
2. 若i<6或者i为奇数,直接判断不会购买
3. 如果i-6个橙子可以购买,i-8不可以(DP[i]=DP[i-6]+1)
4. 如果i-6个橙子不可以购买,i-8可以(DP[i]=DP[i-8]+1)
5 如果i-6个橙子不可以购买,i-8不可以(DP[i]=-1)
6 如果i-6个橙子可以购买,i-8可以(MIN(DP[i-8],DP[i-6])+1)

/*小明去附近的水果店买橙子,水果商贩只提供整袋购买,
有每袋6个和每袋8个的包装(包装不可拆分)。
可是小明只想购买恰好n个橙子,并且尽量少的袋数方便携带。
如果不能购买恰好n个橙子,小明将不会购买。
*/
#include <iostream>
#include<algorithm>
using namespace std;
int DP[100];
int MIN(int a,int b)
{
    return a<b?a:b;
}
int Buy_orange(int number)
{
    DP[0]=0;
    if((number<6||number%2==1))
        return -1;
    else
    {
       for(int i=6;i<=number;i=i+2)//步长为2,忽略奇数
       {
           if(DP[i-6]==-1&&DP[i-8]==-1)
            DP[i]=-1;
           else if(DP[i-6]!=-1)
            DP[i]=DP[i-6]+1;
           else if(DP[i-8]!=-1)
            DP[i]=DP[i-8]+1;
          if(DP[i-6]!=-1&&DP[i-8]!=-1)
            DP[i]=MIN(DP[i-8],DP[i-6])+1;
       }
    }
       return DP[number];

}
int main()
{
    fill(DP,DP+100,-1);
    int number;
    cin>>number;

    cout<<Buy_orange( number);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值