爆搜小议-洛谷2744[USACO5.3]量取牛奶Milk Measuring

来源:互联网 发布:淘宝返利哪个 编辑:程序博客网 时间:2024/06/05 15:14

我一开始用dp做的,后来发现好像子状态的最优解未必能构成最终答案的最优解,挣扎一会就放弃了;
后来去看看别人的题解,发现是爆搜;
爆搜啊…….
于是就爆搜了,却还是超时;
我和别人的程序对拍一下,发现大同小异,但细节决定成败,小异像大坝的蚁穴,把我程序打垮了;
现在想想preyer的劝告:
前两题一定要AC,后两题分分必争!
是极其正确的啊

#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>using namespace std;int a[101],an[101],ans[101];int n,m,x,sum;bool p;void getnew(int z){    sum=z;    for(int i=1;i<=z;i++)ans[i]=an[i];}void dfs(int x,int y,int z){//第x位,剩余y,当前已买了z个桶     if(z>sum)return;    an[z]=a[x];    if(y%a[x]==0){        if(z>sum)return;else        if(z<sum)getnew(z);else{            for(int i=1;i<=z;i++)if(an[i]!=ans[i]){                if(an[i]<ans[i])getnew(z);                break;            }        }        return;    }    if(x==n)return;    for(int j=1;j<=y/a[x];j++)dfs(x+1,y-a[x]*j,z+1);    dfs(x+1,y,z);}int main(){    scanf("%d%d",&m,&n);    for(int i=1;i<=n;i++)scanf("%d",&a[i]);    sum=1e9;    sort(a+1,a+n+1);    dfs(1,m,1);    printf("%d",sum);    for(int i=1;i<=sum;i++)printf(" %d",ans[i]);}
1 0
原创粉丝点击