题意: 拉登有面值 1 2 5 的钱币 分别 n1 n2 n5 个
求出最大能连续组合到多大
思路: 想来想去都有bug 最后简单粗暴的一个一个来处理了
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#define mem(a,b) memset(a,b,sizeof(a))
#define ll __int64
#define MAXN 1000
#define INF 0x7ffffff
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int num[10000];
using namespace std;
int main()
{int n1,n2,n5;int i,j,flag,ans;while(scanf("%d%d%d",&n1,&n2,&n5)!=EOF){if(n1==0&&n2==0&&n5==0) break;mem(num,-1);num[0]=0;flag=0;ans=0;int m=n1+n2*2+n5*5; //最大8000int cnt=n1+n2+n5; //最大3000while(cnt--){if(n1) {flag=1;n1--;}else if(n2){flag=2;n2--;}else if(n5){flag=5;n5--;}for(i=m;i>=0;i--){if(num[i]==0){num[i+flag]=0;}}}for(i=0;i<=100000;i++){//cout<<i<<" "<<num[i]<<endl;if(num[i]==-1){ans=i;break;}}cout<<ans<<endl;}return 0;
}
母函数
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
int num[10];
int c1[9000];
int c2[9000];
void fun()
{int n=num[0]+num[1]*2+num[2]*5;int i,j,k;memset(c2,0,sizeof(c2));memset(c1,0,sizeof(c1));for(i=0;i<=num[0];i++){c1[i]=1;}for(j=0;j<=num[0];j++){for(k=0;k<=num[1]*2;k+=2){c2[j+k]+=c1[j];}}for(j=0;j<=n;j++){c1[j]=c2[j];c2[j]=0;}/*for(i=0;i<=18;i++){printf("%d %d\n",i,c1[i]);}*/for(j=0;j<=num[1]*2+num[0];j++){for(k=0;k<=num[2]*5;k+=5){c2[j+k]+=c1[j];}}for(j=0;j<=n;j++){c1[j]=c2[j];c2[j]=0;}
}
int main()
{int n;int i,j,k;while(scanf("%d%d%d",&num[0],&num[1],&num[2])!=EOF){if(num[0]==0&&num[1]==0&&num[2]==0) break;fun();for(i=0;i<=8010;i++){if(c1[i]==0){printf("%d\n",i);break;}//printf("%d %d\n",i,c1[i]);}}return 0;
}