题目请点我
思路:
一开始用动态规划做的,但是其实只是一道证明题。
公式:
1.若0~4能取到,则不能取到的数为num = 5*s5 + 2*s2+s1;
2.num = 0~4不能取到的数;
代码:
dp版本:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define MAX 8010
using namespace std;
int a[3]={1,2,5};
int num[3];
int dp[MAX];
int main()
{
int p,q,w,sum;
while( scanf("%d%d%d",&p,&q,&w)!=EOF )
{
if( p == 0 && q == 0 && w == 0 )
break;
sum = 0;
num[2] = w;
num[1] = q;
num[0] = p;
memset(dp,0,sizeof(dp));
dp[0] = 1;
for(int i = 0; i < 3; i++)
sum += num[i]*a[i];
for( int i = 0; i < 3; i++ ){
for( int j = sum; j >= 0; j-- ){
if( dp[j] == 1 ){
for( int t = 1; t <= num[i]; t++ ){
dp[j+t*a[i]] = 1;
}
}
}
}
for( int i = 0; i <= sum+1; i++ ){
if( dp[i] == 0 ){
printf("%d\n",i);
break;
}
}
}
return 0;
}
数学版本:
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
int main(){
int n1,n2,n3;
while( scanf("%d%d%d",&n1,&n2,&n3)!=EOF ){
if( n1 == 0 && n2 == 0 && n3 == 0 ){
break;
}
for( int i = 1; i <= 5; i++ ){
if( i == 1 ){
if( n1 == 0 ){
printf("%d\n",i);
break;
}
}
else if( i < 5 && i >= 2 ){
if( n2*2 + n1 < i ){
printf("%d\n",i);
break;
}
}
else{
printf("%d\n",5*n3+2*n2+1*n1+1);
break;
}
}
}
}