首页 > 试题广场 >

买橘子

[编程题]买橘子
  • 热度指数:2518 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

小明去附近的水果店买橙子,水果商贩只提供整袋购买,有每袋6个和每袋8个的包装(包装不可拆分)。可是小明只想购买恰好n个橙子,并且尽量少的袋数方便携带。如果不能购买恰好n个橙子,小明将不会购买。


输入描述:
输入一个整数n,表示小明想要购买n(1≤n≤100)个橙子


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

输入

20

输出

3

其他语言永远也体会不到C语言的快乐(尤其是C++)
#include <stdio.h>

int main()
{
	int n,i;
	scanf("%d",&n);
	if(n<6 || n&1 || n==10)
	{
		puts("-1");
		return 0;
	}
	n >>= 1;
	for(i=(n>>2);i>EOF;i--)
		if((n-(i<<2))%3==0)
		{
			printf("%d\n",i+(n-(i<<2))/3);
			return 0;
		}
}

发表于 2019-08-20 16:19:50 回复(0)
import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        flag:{if(n%8==0){
            System.out.println(n/8);
        }else{
            for(int i=n/8;i>=0;i--){
                int x=n-i*8;
                if(x>=6&&x%6==0){
                    System.out.println(i+x/6);
                    break flag;
                }
            }
            System.out.println(-1);
        }
             }
    }
}

发表于 2019-04-01 07:49:40 回复(0)
import sys
n=int(sys.stdin.readline().strip())
# 6个的有x袋,8个的有y袋
# x属于[0,16]
# y属于[0,12]
# 遍历所有可能
results=[]
for x in range(17):
    for y in range(13):
        if 6*x+8*y==n:
            result=x+y
            results.append(result)
if len(results)==0:
    print(-1)
else:
    print(min(results))

发表于 2019-03-31 20:09:13 回复(1)
import sys
n=int(sys.stdin.readline())
a=int(n/8)+1
res=[]
for i in range(a):
    if (n-8*i)%6==0:
        res.append(int(i+(n-8*i)/6))
if len(res)==0:
    print(-1)
else:
    res=sorted(res)
    print(res[0])
发表于 2019-03-19 20:22:54 回复(0)
暴力枚举就好,给的范围比较宽,数也比较小,所以直接循环得所有情况一一检验就好
#include<iostream>
using namespace std;
int main(){
    int n;
    cin>>n;
    if(n%2!=0||n<6)
        cout<<-1;
    else{
        int min=100;
        for(int i=0;i<13;i++){
            for(int j=0;j<17;j++){
                if(8*i+6*j==n)
                    min=i+j;
            }
        }
        cout<<min<<endl;
    }
}

发表于 2019-02-16 20:33:03 回复(0)
#include <bits/stdc++.h> 
	
using namespace std;
int main () { int n; cin >> n; for (int i=0; i<=17; ++i) { for (int j=0; j<=13; ++j) { if (6 * i + 8 * j == n) { cout << i + j << endl; return 0; } } } cout << -1 << endl; return 0;
}



这题其实是我在给另一道题打表的时候顺便水过去的,因为这题确实很水。
首先算出100/6的值向上取整是17, 100/8向上取整的值13,再看一下这题数据范围,惊奇的发现只有100.
那就意味着O(n2)可以过!
那么我们只要选择暴力枚举就好了。于是就有了上面的两重循环
编辑于 2019-02-07 17:31:32 回复(1)
import java.util.*;

public class Main {
    public static final int MAX = 105;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] bags = {6, 8};
        int[] dp = new int[MAX];
        for (int i=0; i!=bags.length; i++) {
            dp[bags[i]] = 1;
        }
        Arrays.fill(dp, -1);
        dp[0] = 0;
        for (int i=1; i<=n; i++) {
            for (int j=0; j<bags.length; j++) {
                if (i - bags[j] >= 0 && dp[i - bags[j]] > -1) {
                    if (dp[i] == -1 ) {
                        dp[i] = dp[i - bags[j]] + 1;
                    }else {
                        dp[i] = Math.min(dp[i], dp[i - bags[j]] + 1 );
                    }
                }
            }
        }
        System.out.println(dp[n]);
        return;
    }
}
发表于 2019-01-27 19:07:43 回复(0)
package main

import (
    "fmt"
)

func main() {
    var n int
    fmt.Scan(&n)
    ans:=-1
    var dfs func(int,int)
    dfs=func(sum int,cnt int){
        if sum>=n{
            if sum==n{
                if ans==-1{
                    ans=cnt
                }else if ans>cnt{
                    ans=cnt
                }
            }
            return
        }
        dfs(sum+8,cnt+1)
        dfs(sum+6,cnt+1)
    }
    dfs(0,0)
    fmt.Print(ans)
}

发表于 2023-03-18 12:20:58 回复(0)
#include<stdio.h>
int main()
{
	int n;
	while (scanf("%d",&n)!=EOF)
	{
		int i,j,min=100;
		for(i=0;i<=12;i++)
		{
			for(j=0;j<=16;j++)
			{
				if(8*i+6*j==n)
				{
					if((i+j)<min)
					{
						min=i+j;
					}
				}
			}
		}
		if(min==100) printf("-1\n");
		else printf("%d\n",min);
	}
    return 0;
}

发表于 2021-10-26 20:03:03 回复(0)
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
    int orange_n,j,find;
    cin>>orange_n;
    int bag_n=65535;
    find=0;
    for(int i=0;i*6<=orange_n;i++) //包装A买的袋数
    {
        if((orange_n-i*6)%8==0) //刚好放完
        {
            j=(orange_n-i*6)/8; //包装b买的袋数
            bag_n=(bag_n<(i+j))?bag_n:(j+i); //求当前方案是否是最小袋数
            find=1;  // 找到了可行方案
        }
        
    }
    if(find)
    {
        cout<<bag_n<<endl;
    }
    else cout<<-1<<endl; //没找到可行方案
}

发表于 2020-08-15 13:44:04 回复(0)
动态规划基础题。
#include<bits/stdc++.h>
using namespace std;
int n,dp[105]; //dp[i]表示买i个橘子最少需要的袋数
int main(){
    //dp[i]=min(dp[i-6],dp[i-8])+1
    memset(dp,0,sizeof(dp));
    cin >> n;
    dp[0] = 0;
    for(int i = 1;i <= n;i++){
        if(i<6||i==7){
            dp[i] = 0xffffff; //不可能用袋子买到这样的橘子
            continue;
        }
        dp[i] = min(dp[i-6],dp[i-8])+1; //状态转移
    }
    if(dp[n]>=0xfffff) cout << -1;
    else cout << dp[n];
    return 0;
}


编辑于 2020-07-26 12:34:29 回复(0)
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
	int i, j, n, p, m=0;
	cin >> n;
	for (i = 0; i < 17; i++)
	{
		for (j = 0; j < 13; j++)
		{
			p = 6 * i + 8 * j;
			if (p == n)
			{
				m = i + j;
                cout << m << endl;
               return 0;
			}
		}
	}
	cout << "-1" << endl;
	return 0;
}

发表于 2020-07-22 09:45:31 回复(0)
n = int(input())
l1, l2 = [0, 6, 8, 12, 14, 16, 18, 20, 22], [0, 1, 1, 2, 2, 2, 3, 3, 3]
a, b = n // 24, n % 24
print(3 * a + l2[l1.index(b)] if b in l1 else -1)

发表于 2020-07-12 19:08:48 回复(0)
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.Scanner;
import java.util.Stack;

public class Main {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        if (n % 2 != 0) {

            System.out.print("-1");

            return;

        }
        int count=0;
        while(n>24) {
            
            count++;
            n-=8;
            //System.out.println(n);
        }
        
        if(n==16) {
            
            System.out.println(count+2);
            
        }else {
            
            System.out.println(count+3);
        }
        
        

    }

}
发表于 2020-06-06 20:44:36 回复(0)
n%8 取余是奇数,直接输出 -1
2+2*8 = 3*6
4+8 = 2*6
6 = 1*6
if __name__=='__main__':
    n = int(input().strip())
    ans = n//8
    k = n%8
    if k&1==1:
        print(-1)
    elif k==2:
        if ans >=2:
            ans += 1
            print(ans)
        else:
            print(-1)
    else:
        print(ans+1)


发表于 2019-09-10 14:35:47 回复(0)
题目数字很小,暴力破解当然可以。因为最近在练习DFS,就顺手用DFS的思路写了一个。
#include <iostream>
#include <string>
#include <climits>
using namespace std;

int num, minLength = INT_MAX;

void dfs(int n, string pre)
{
    string cur1, cur2;

    if(n > num){
        pre = "";
        return;
    }
    
    if(n == num){
        //cout << pre << " ";
        if(pre.size() < minLength)
            minLength = pre.size();
        return;
    }
    
    cur1 = pre + "6";
    dfs(n + 6, cur1);
        
    cur2 = pre + "8";
    dfs(n + 8, cur2);

}

int main()
{
    
    cin >> num;
    dfs(0, "");
    
    minLength != INT_MAX ? cout << minLength << endl: 
    cout << -1 << endl;
    
    return 0;
}


发表于 2019-08-22 13:44:54 回复(0)
注意判断条件。这个题的测试用例有问题,完全通过也可能会有问题。
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int count = -1;
        if((n%8)%2==0){
            if((n%8)==0){
                count = n/8;
            }else if(n%8 == 6){
                count = n/8+1;
            }else if(n/8>=(6-n%8)/2){
                count = n/8+1;
            }
        }
        System.out.println(count);
        return;
    }
}

发表于 2019-06-11 09:43:30 回复(0)
1、先排除肯定无结果的情况(奇数和小于6的数)
2、判断是否能被8整除
3、根据袋数越少越好则从最多按8个成袋开始依次判断
#include<iostream>
using namespace std;
int main()
{
    int n;
    cin>>n;
    if(n%2||n<6)
    {
        cout<<-1<<endl;
        return 0;
    }
    if(n%8==0)
    {
        cout<<n/8<<endl;
        return 0;
    }
    for(int c=n/8;c>=0;c--)
    {
        if((n-8*c)%6==0)
        {
            cout<<c+(n-8*c)/6<<endl;
            return 0;
        }
    }
    cout<<-1<<endl;
    return 0;
}

发表于 2019-04-25 21:14:39 回复(0)
import java.util.Scanner;
public class Main {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        int k = scanner.nextInt();
        System.out.println(sumbag(k));

    }

    public static int sumbag(int n) {

        if (n % 2 != 0)
            return -1;
        int k = n / 8;
        int rest = n % 8;
        if (rest == 0)
            return k;
        if (rest%6==0) 
            return k+1;
        
        for (int i = 1; i <= k; i++)
        {
            rest += 8;
            if (rest % 6 == 0) {
                return k - i + rest / 6;
            }
        }
        return -1;

    }
 优先装八个  k = n / 8如果没有余数  那就必然k是最小值 ,如果有余数先判断余数是否刚好是六个 如果是加上这一个袋子    否则k-i   然后 rest=rest+8*i   一直到rest%6==0 就好了   如果一直到最后都不行  就返回-1就好
发表于 2019-04-04 01:36:59 回复(0)
import java.io.IOException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        
        if(n % 2 != 0 || n == 10) {
            System.out.println(-1);
        }else {
            int result2 = 0;
            if(n % 8 != 0) {
                result2 = n / 8 + 1;
            }
            else {
                result2 = n / 8;
            }
            System.out.println(result2);
        } 
    }
}
如此简单,只需要看,8的整数倍整除即可,不是整数倍加1,因为最后面的可以用6来代替8
发表于 2019-03-25 09:20:30 回复(1)

问题信息

上传者:小小
难度:
28条回答 3754浏览

热门推荐

通过挑战的用户

查看代码