题意:
给你一些硬币,价值为1,2,5,问你它们的和中第一个不能构造出来的数是多少
题解:
最高价值为8000,那么将上限调到这,依旧是个模板题
∏
i
=
1
n
(
1
+
i
v
[
i
]
+
i
2
v
[
i
]
+
.
.
.
)
\prod\limits_{i=1}^{n}(1+i^{v[i]}+i^{2v[i]}+...)
i=1∏n(1+iv[i]+i2v[i]+...)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=8005;
ll dp[2][N];
int a[5],v[5];
int main()
{
v[1]=1,v[2]=2,v[3]=5;
while(~scanf("%d%d%d",&a[1],&a[2],&a[3])){
if(!(a[1]+a[2]+a[3]))return 0;
//int lim=a[1]+2*a[2]+5*a[3];
int f=0;
memset(dp[f],0,sizeof(dp[f]));
dp[f][0]=1;
int top=0;
for(int i=1;i<=3;i++){
int nt=top+a[i]*v[i];
memset(dp[f^1],0,sizeof(ll)*(nt+2));
for(int j=0;j*v[i]<=nt&&j<=a[i];j++)
for(int k=0;k<=top&&k+j*v[i]<=nt;k++)
dp[f^1][k+j*v[i]]+=dp[f][k];
f^=1;
top=nt;
}
int ans=0;
for(int i=1;i<N;i++){
if(!dp[f][i]){
ans=i;
break;
}
}
printf("%d\n",ans);
}
return 0;
}