1. 程式人生 > >兩個數求不能組合成的最大數

兩個數求不能組合成的最大數

在網上看到了類似的題目,本來覺得是一個益智類題目,於是好奇來做

發現和2017年藍橋杯的一道程式設計題很相似。於是拿來認真做一下

題目意思:

小明開商店,只有2種類型的糖果,第一種每包有5個,第二種每包有3個,小明發現,他可以用這兩種糖組合成很多數目的糖果,如8  13 等。但是也有一些數目組合不了,如1    2     4    6 。那麼問題來了,求最大的無法組合的數

這道題看似是數學題。但是其實是一個程式設計題

為什麼那?

這道題可以用揹包來做!!!!!

原理:

用揹包其實可以判斷物品放滿揹包沒有。

把dp全部初始化為負無窮。把dp【0】賦值 為0

這樣如果dp【i】裡面的值大於0,就表示揹包放滿了

把這幾種的糖果(當然可以是好幾種)看做物品,價值隨便取只要大於零,每包的個數看做體積

#include <algorithm>
#include <string.h>
#include <iostream>
#include <stdio.h>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
using namespace std;
bool s[99999];
int dp[99999];
int num[3];
int gcd(int a,int b)
{
    if(b == 0) return a;
    return gcd(b,a%b);
}
int main()
{
    int a,b;
    while(scanf("%d%d",&a,&b)!=EOF)
    {
        for(int j=0; j<=99999; j++)
        {
            dp[j]=-99999999;
        }
        num[1]=a,num[2]=b;
        dp[0]=0;
        for(int i=1; i<=2; i++)
        {
            for(int j=num[i]; j<=99999; j++)
            {
                dp[j]=max(dp[j],dp[j-num[i]]+1);
            }
        }
        int sum=0;
        for(int i=1; i<=99999; i++)
        {
            if(dp[i]<0)
            {
                sum=i;
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}
這是兩個的情況,如果有多個的情況,把物品的個數改一下就行了

我還有一個小發現:

對於只有兩個的情況

他們不能組成的最大是兩數之積減去兩數之和

比如  5  3 :  5*3-(5+3)=7

10 11  :10*11-(10+11)=89