网易2017年秋招买苹果

小易去附近的商店买苹果,奸诈的商贩使用了捆绑交易,只提供6个每袋和8个每袋的包装(包装不可拆分)。 可是小易现在只想购买恰好n个苹果,小易想购买尽量少的袋数方便携带。如果不能购买恰好n个苹果,小易将不会购买。
输入描述:
输入一个整数n,表示小易想购买n(1 ≤ n ≤ 100)个苹果

输出描述:
输出一个整数表示最少需要购买的袋数,如果不能买恰好n个苹果则输出-1

输入例子:
20

输出例子:
3

1、暴力法:
import java.util.Scanner;

/**
*
* @author 慕一春
* @version 1.0.0
* @filename Main.java
* @time 2016-9-21 下午2:50:56
* @copyright(C) 2016
*/
public class Main {

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    int r = n / 6; 
    int c = n / 8;
    int min = Integer.MAX_VALUE;
    for (int i = 0; i <= r; i++){
        for (int j = 0; j <= c; j++){
            if (i*6 + j*8 == n){
                if (min > i+j) min = i+j;
            }
        }
    }
    if (min == Integer.MAX_VALUE) System.out.println(-1);
    else System.out.println(min);
}

}

2、分几种情况分析:
import java.util.Scanner;
public class Main{
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
System.out.println(count(n));
}
public static int count(int n){
if(n%2!=0||n==10||n<6)
return -1;
if(n%8==0)
return n/8;
return 1+n/8;
}
}
3、动态规划
题目要求出购买n个苹果的袋数最少的方案,容易理解,当n越来越大时,那么确定方案的难度就越大,因此,我们可以先规划出n较小时的最优方案,然后随着n的变大,不断修改方案,直到得出最终方案, 详细说一下解题的步骤:
1.首先创建一个长度为n+1的动态规划数组,数组元素i表示购买i个苹果的最少袋数dp[i];
2.对动态规划数组进行初始化,dp[0]的初始值当然是0了,然后将其他的元素初始化为Integer.MAX_VALUE,表示不可达,即不能恰好购买指定数量的苹果;
3.对动态规划数组进行遍历,我们详细描述一下遍历至元素i时的操作,首先判断当前元素的值是否为Integer.MAX_VALUE,若是则跳过当前循环,否则计算dp[i+6.的数值,在dp[i+6]的原始值和dp[i]+1(表示买一袋)中取最小值然后赋给dp[i+1],保证方案为最优方案,同样,我们需要进行dp[i+8]的计算,选出最优方案(注意:不过在进行计算是,一定要保证i+6或者i+8小于等于n,防止数组越界)
7.当循环结束时,判断dp[n]等于Integer.MAX_VALUE,那么输出-1.表示不能恰好购买n个苹果,否则输出dp[n],即为最优方案.
算法如下:

import java.util.Scanner;
import java.util.Arrays;

public class Main{
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
int[] dp=new int[n+1];
dp[0]=0;
Arrays.fill(dp,1,n+1,Integer.MAX_VALUE);

        for(int i=0;i<n+1;i++){
            if(dp[i]==Integer.MAX_VALUE){
                continue;
            }
            int[] array={6,8};
            for(int j=0;j<2;j++){
                int temp=array[j];
                if(i+temp<=n){
                    dp[i+temp]=Math.min(dp[i+temp],dp[i]+1);
                }
            }
        }
        if(dp[n]==Integer.MAX_VALUE){
            System.out.println(-1);
        }else{
            System.out.println(dp[n]);
        }
    }

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值