HDU1114

         这题是完全背包问题。看过背包九讲,再搜了下网上大牛们的代码,才有一点小懂!

         主要是想贴上的我的四个AC代码,看看对函数的不同处理对运行时间的影响:

          ①

#include<iostream>
using namespace std;

#define INF 0x7fffffff

int empty,full,n_case;
int record[10000];

struct node
{
    unsigned int value;
    int weight;
}a[500];

int main()
{
    int t_case,volume,i,j;

    cin>>t_case;

    while(t_case--)
    {
        cin>>empty>>full>>n_case;

        for(i=0;i<n_case;i++)
            cin>>a[i].value>>a[i].weight;

        volume=full-empty;
        record[0]=0;
        for(i=1;i<=volume;i++)
            record[i]=INF;
        for(i=0;i<n_case;i++)
        {
            for(j=a[i].weight;j<=volume;j++)
            {
                if(record[j-a[i].weight]+a[i].value <record[j])
                    record[j]=record[j-a[i].weight]+a[i].value;
            }
        }
        
        if(record[volume]<INF)
            cout<<"The minimum amount of money in the piggy-bank is "<<record[volume]<<"."<<endl;
        else
            cout<<"This is impossible."<<endl;
    }

    return 0;}

 

        ②

#include<iostream>
using namespace std;

#define INF 0x7fffffff

#define min(a,b) a>b?b:a

int empty,full,n_case;
int record[10000];

struct node
{
    unsigned int value;
    int weight;
}a[500];

int main()
{
    int t_case,volume,i,j;

    cin>>t_case;

    while(t_case--)
    {
        cin>>empty>>full>>n_case;

        for(i=0;i<n_case;i++)
            cin>>a[i].value>>a[i].weight;

        volume=full-empty;
        record[0]=0;
        for(i=1;i<=volume;i++)
            record[i]=INF;
        for(i=0;i<n_case;i++)
        {
            for(j=a[i].weight;j<=volume;j++)
            {
               record[j]=min(record[j-a[i].weight]+a[i].value,record[j]);
            }
        }
        
        if(record[volume]<INF)
            cout<<"The minimum amount of money in the piggy-bank is "<<record[volume]<<"."<<endl;
        else
            cout<<"This is impossible."<<endl;
    }

    return 0;
}


        ③

#include<iostream>
using namespace std;

//#define INF 0x7fffffff
#define INF 9999999

int empty,full,n_case;
int record[10000];

struct node
{
    unsigned int value;
    int weight;
}a[500];

int min(int p,int q)
{
    return p>q?q:p;
}

int main()
{
    int t_case,volume,i,j;

    cin>>t_case;

    while(t_case--)
    {
        cin>>empty>>full>>n_case;

        for(i=0;i<n_case;i++)
            cin>>a[i].value>>a[i].weight;

        volume=full-empty;
        record[0]=0;
        for(i=1;i<=volume;i++)
            record[i]=INF;
        for(i=0;i<n_case;i++)
        {
            for(j=a[i].weight;j<=volume;j++)
            {
               record[j]=min(record[j-a[i].weight]+a[i].value,record[j]);
            }
        }
        
        if(record[volume]<INF)
            cout<<"The minimum amount of money in the piggy-bank is "<<record[volume]<<"."<<endl;
        else
            cout<<"This is impossible."<<endl;
    }

    return 0;
}


          ④

#include<iostream>
using namespace std;

//#define INF 0x7fffffff
#define INF 9999999

int empty,full,n_case;
int record[10000];

struct node
{
    unsigned int value;
    int weight;
}a[500];

inline int min(int p,int q)
{
    return p>q?q:p;
}

int main()
{
    int t_case,volume,i,j;

    cin>>t_case;

    while(t_case--)
    {
        cin>>empty>>full>>n_case;

        for(i=0;i<n_case;i++)
            cin>>a[i].value>>a[i].weight;

        volume=full-empty;
        record[0]=0;
        for(i=1;i<=volume;i++)
            record[i]=INF;
        for(i=0;i<n_case;i++)
        {
            for(j=a[i].weight;j<=volume;j++)
            {
               record[j]=min(record[j-a[i].weight]+a[i].value,record[j]);
            }
        }
        
        if(record[volume]<INF)
            cout<<"The minimum amount of money in the piggy-bank is "<<record[volume]<<"."<<endl;
        else
            cout<<"This is impossible."<<endl;
    }

    return 0;
}


        好的吧,这里还有个WA的代码,希望大牛们看到指点一二!

       

#include<iostream>
using namespace std;

#define INF 0x7fffffff

int min(int p,int q)
{
    return p>q?q:p;
}

int empty,full,n_case;
int record[10000];

struct node
{
    unsigned int value;
    int weight;
}a[500];

int main()
{
    int t_case,volume,i,j;

    cin>>t_case;

    while(t_case--)
    {
        cin>>empty>>full>>n_case;

        for(i=0;i<n_case;i++)
            cin>>a[i].value>>a[i].weight;

        volume=full-empty;
        record[0]=0;
        for(i=1;i<=volume;i++)
            record[i]=INF;
        for(i=0;i<n_case;i++)
        {
            for(j=a[i].weight;j<=volume;j++)
            {
               record[j]=min(record[j-a[i].weight]+a[i].value,record[j]);
            }
        }
        
        if(record[volume]<INF)
            cout<<"The minimum amount of money in the piggy-bank is "<<record[volume]<<"."<<endl;
        else
            cout<<"This is impossible."<<endl;
    }

    return 0;
}

以上的WA代码,如下修改下140MS过了。。。

感谢本博文下的评论者的提示。

for(i=0;i<n_case;i++)
        {
            for(j=a[i].weight;j<=volume;j++)
            {
                if(record[j-a[i].weight]==INF) continue;   //这句不加,可能造成数据溢出 
                record[j]=min(record[j-a[i].weight]+a[i].value,record[j]);
            }
        }


    

         

 

你可能感兴趣的:(struct)