兩個數求不能組合成的最大數
阿新 • • 發佈:2019-02-12
在網上看到了類似的題目,本來覺得是一個益智類題目,於是好奇來做
發現和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