HDU_1085 Holding Bin-Laden Captive!(数学)

来源:互联网 发布:关闭搜狗输入云计算 编辑:程序博客网 时间:2024/06/06 16:39

题目请点我
思路:
一开始用动态规划做的,但是其实只是一道证明题。
公式:
1.若0~4能取到,则不能取到的数为num = 5*s5 + 2*s2+s1;
2.num = 0~4不能取到的数;
代码:
dp版本:

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#define MAX 8010using 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;            }        }    }}
0 0
原创粉丝点击