在网上看到了类似的题目,本来觉得是一个益智类题目,于是好奇来做
发现和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