hdu 1709 The Balance

来源:互联网 发布:网络协议分析课后答案 编辑:程序博客网 时间:2024/05/17 02:48

我感觉这种题正是现在的我应该做的,感觉学到东西了,而不是坑的无奈

比赛时我就算看了估计也做不出来,压根不会想到dp那;

这个题是一个基础0-1dp吧,许多人用了母函数,但我基本不知道母函数是什么,无奈

思路:

dp[i][j]表示前i个物体是否能测量物体j,是为true,反为false;

状态转移方程:

dp[i-1][j]==1,则dp[i][j+a[i]]=1;dp[i][abs(a[i]-j)]=1;小心忘了dp[i][j]=1;

dp[0][0]=1;

因为从前往后推,所以dp[0][0]为true,能推出dp[1][a[1]]=1;

代码如下,已ac

#include<iostream>#include<cmath>#include<cstring>#include<queue>;using namespace std;int a[1100];bool  dp[110][11000]={0};bool  visit[10010]={0};int main(){    int n;    int i,j;    while(cin>>n)    {        memset(dp,false,sizeof(dp));        memset(visit,false,sizeof(visit));        queue<int> s;        int i;        int sum=0;        for(i=1;i<=n;i++)        {          cin>>a[i];          sum+=a[i];          visit[a[i]]=true;          dp[i][a[i]]=true;          visit[sum]=true;          dp[i][sum]=true;        }        dp[0][0]=true;        for(i=1;i<=n;i++)        {           for(j=0;j<=sum;j++)           {              if(dp[i-1][j]==true)              {                  dp[i][j]=true;                  dp[i][j+a[i]]=true;                  int k=abs(j-a[i]);                  dp[i][k]=true;                  visit[j+a[i]]=true;                  visit[k]=true;              }           }        }        int sum1=0;        for(i=1;i<=sum;i++)        {            if(visit[i]!=1)                {                    sum1++;                    s.push(i);                }        }        cout<<sum1<<endl;        int t=0;        if(sum1!=0)        {            while(!s.empty())                {           if(t!=0)           {               cout<<' ';           }           t=1;           cout<<s.front();           s.pop();                }             cout<<endl;        }    }    return 0;}


0 0