题解 P2737 【[USACO4.1]麦香牛块Beef McNuggets】

shadowice1984

2017-10-07 16:41:12

Solution

来一发dp 显然,如果我们令dp[i]表示能否凑出i个牛块。 则满足以下递推式 if(dp[i])dp[i+weight[x]]=true; 然后我们需要的就是确定容量。 然后有这样一个结论, 若p,q互质,则任意大于lcf(p,q)-p-q的数都能被p,q表示 然后dp就好~ ```cpp #include<stdio.h> using namespace std; int gcd(int a,int b) { if(b==0)return a; else return gcd(b,a%b); } int lcf(int a,int b) { return a*b/gcd(a,b); } bool dp[80000]; int weight[10]; int n;int cont=0x3f3f3f3f; int res=0; int main() { scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&weight[i]); } int g=weight[0]; for(int i=0;i<n;i++)//确定容量 { g=gcd(g,weight[i]); if(g==1)break; } if(g!=1) { printf("0");return 0; } for(int i=0;i<n;i++) { for(int j=0;j<=i;j++) { int t=lcf(weight[i],weight[j]); if(cont>t&&gcd(weight[i],weight[j])==1)cont=t; } } dp[0]=true; for(int i=0;i<n;i++)//dp { for(int j=0;j<cont;j++)//每个物品可以多次使用 { if(dp[j]==true) { dp[j+weight[i]]=true; } } } for(int i=0;i<cont;i++) { //printf("dp[%d]is%d\n",i,dp[i]); if(dp[i]==false)res=i; } printf("%d",res); return 0;//拜拜程序 } ```