【题目】
小明去附近的水果店买橙子,水果商贩只提供整袋购买,有每袋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;
}