USACO4.1.1 Beef McNuggets (nuggets)

来源:互联网 发布:0 1背包分支界限算法 编辑:程序博客网 时间:2024/06/06 23:52

计算所有读入的最大公约数,如果最大公约数不为1,则输出0,即无法满足任何数量的答案

接着用dp求解(1~65536),状态转移方程为:dp[ i ]  = dp[ i ]   |  dp[  i - num[ j ]  ]

从65536开始倒序扫描dp[ ]数组,第一个为0的dp[ i ]对应的 i 即为答案


/*ID:xsy97051LANG:C++TASK:nuggets*/#include <iostream>#include <cstdio>#include <cstring>using namespace std;int n,num[11],k;bool dp[100000];int gcd(int x,int y){if(x==0) return y;return gcd(y%x,x);}int main(){freopen("nuggets.in","r",stdin);freopen("nuggets.out","w",stdout);cin>>n;for(int i=1;i<=n;i++)cin>>num[i];k=num[1];for(int i=2;i<=n;i++)k=gcd(k,num[i]);if(k!=1){cout<<0<<endl;return 0;}memset(dp,0,sizeof(dp));dp[0]=1;for(int i=1;i<=65536;i++)for(int j=1;j<=n;j++)if(i>=num[j])dp[i]=dp[i] | dp[i-num[j]];int res=0;for(int i=65536;i>=1;i--)if(!dp[i]){res=i;break;}cout<<res<<endl;return 0;}



0 0
原创粉丝点击