时间优化的算法题

POJ

2236

我在poj上2236测试了很多实例,显示:

在输入输出上:用scanf,printf代替cin,cout可以大大加快时间,尤其对于输入、输出频繁的测试

1014

是一道动态规划的题目,但是可能超时,需要剪枝,搜索现在还是低级之低级,就不试了

#include <iostream>
using namespace std;
int a[60001],num[6],sum;
bool dp()
{
    sum/=2;
    int mmax=0;
    a[0]=1;
    for(int i=6;i>0;i--)
    {
        for(int j=mmax;j>=0;j--)
        {
            if(a[j]==0)
            continue;
            for(int k=1;k<=num[i-1];k++)
            {
                if(j+k*i>sum||a[j+k*i] )   //开始没加||a[j+k*i] ,300ms,加了后0,以后记得动态规划的剪枝
                   break;
                else if(j+k*i==sum)
                return true;
               else if(j+k*i>mmax)
                  mmax=j+k*i;
                a[j+k*i]=1;
            }
        }  
    }
    return false;
}   
int main()
{
    int flag,i,cs=0;
    while(1)
    {
        memset(a,0,sizeof(a));
        sum=0;
        for(i=0;i<6;i++){
        scanf("%d",&num[i]);
        sum+=(i+1)*num[i];
    }
    if(sum==0)
    break;   
    if(sum%2||dp()==false )
    {
        printf("Collection #%d:\nCan't be divided.\n\n",++cs);
        continue;
    }   
    printf("Collection #%d:\nCan be divided.\n\n",++cs);
    }   
system("pause");
return 0;
}

1742 与上题类似的解法,可惜耗时较大,但从大到小排序了后似乎有点改良

http://acm.pku.edu.cn/JudgeOnline/status?problem_id=1742&user_id=tanzhangwen&result=0&language=

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值