zoukankan      html  css  js  c++  java
  • 洛谷 P1490 买蛋糕

    P1490 买蛋糕

    题目描述

    野猫过生日,大家当然会送礼物了(咳咳,没送礼物的同志注意了哈!!),由于不知道送什么好,又考虑到实用性等其他问题,大家决定合伙给野猫买一个生日蛋糕。大家不知道最后要买的蛋糕的准确价格,而只会给蛋糕估价,即要买一个不超过多少钱的蛋糕。众OIer借此发挥:能否用最少的钱币数去凑成估价范围内的所有价值,使得不管蛋糕价值多少,都不用找钱……

    现在问题由此引出:对于一个给定的n,能否用最少的不等的正整数去组成n以内(包括n)的所有的正整数呢?如果能,最少需要多少个正整数,用最少个数又有多少不同的组成方法呢?

    输入输出格式

    输入格式:

     

    只有一行包含一个整数n(1<=n<=1000)。

     

    输出格式:

     

    一行两个数,第一个数是最少需要多少个数,第二个数是用最少个数的组成方案个数。两个答案用空格分隔。

     

    输入输出样例

    输入样例#1:
    6
    
    输出样例#1:
    3 2
    

    说明

    各个测试点2s

    最少用三个数,有两种方法,分别是:1,2,3和1,2,4。

    对于1,2,3有1,2,3,1+3,2+3,1+2+3;

    对于1,2,4有1,2,1+2,4,1+4,2+4。

    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<iostream>
    #include<cstdio>
    using namespace std;
    const int maxn=1005;
    int n,ans,tot;
    int f[11][maxn][maxn];
    int main(){
        cin>>n;
        ans=(int)log2(n)+1;
        f[1][1][1]=1;
        for(int i=1;i<ans;i++)
            for(int j=i;j<=(1<<(i-1));j++)
                for(int k=i;k<=((1<<i)-1);k++)
                    if(f[i][j][k])
                        for(int p=j+1;p<=k+1;p++){
                            if(p+k<=n)//如果加起来在范围内
                                f[i+1][p][k+p]+=f[i][j][k];
                            else//加起来不在范围内
                                f[i+1][p][n]+=f[i][j][k];
                        }
        for(int i=1;i<=n;i++)
            tot+=f[ans][i][n];
        cout<<ans<<" "<<tot<<endl;
        return 0;
    }

     

    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    Mysql开启日志
    amfphp传递负数的bug
    linux /var/spool/clientmqueue 目录占大量空间
    WinXP SSH连接不上虚拟机的解决方法
    批量数据替换助手V1.0版发布
    也谈反射的应用场景
    反射+特性打造简洁的AJAX调用
    文本处理之利器正则表达式闪亮登场
    关于缩略图的生成与访问策略的一些经验分享
    装饰模式个人的一些理解
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/7544279.html
Copyright © 2011-2022 走看看