简单的四道母函数题。都做了2遍,一次母函数,一次计数DP(或叫背包)。
但是这几题背包的效率比母函数高,而且代码也短多了。。。
HDU 1028 Ignatius and the Princess III
代码:
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <map>
using namespace std;
#define LL long long
int c1[130];
int c2[120];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<=n;i++)
{
c1[i]=1;
c2[i]=0;
}
for(int i=2;i<=n;i++)
{
for(int j=0;j<=n;j++)
{
for(int k=0;k+j<=n;k+=i)
{
c2[k+j]+=c1[j];
}
}
for(int i=0;i<=n;i++)
{
c1[i]=c2[i];
c2[i]=0;
}
}
printf("%d\n",c1[n]);
}
return 0;
}
HDU 2082 找单词
代码:
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <map>
using namespace std;
#define LL long long
int c1[55];
int c2[55];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(c1,0,sizeof c1);
memset(c2,0,sizeof c2);
c1[0]=1;
for(int i=1;i<=26;i++)
{
int a;scanf("%d",&a);
for(int j=0;j<=50;j++)
{
for(int k=0,num=0;j+k<=50&&num<=a;k+=i,num++)
{
c2[k+j]+=c1[j];
}
}
for(int j=0;j<=50;j++)
{
c1[j]=c2[j];
c2[j]=0;
}
}
int ans=0;
for(int i=1;i<=50;i++)
{
ans+=c1[i];
}
printf("%d\n",ans);
}
return 0;
}
HDU 1398 Square Coins
代码:
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <map>
using namespace std;
#define LL long long
const int N = 300+6;
int c1[N];
int c2[N];
int coin[20];
void init()
{
for(int i=1;i<=17;i++)
{
coin[i]=i*i;
}
}
int main()
{
int n;
init();
while(~scanf("%d",&n)&&n)
{
for(int i=0;i<=n;i++)
{
c1[i]=1,c2[i]=0;
}
for(int i=2;i<=17&&coin[i]<=n;i++)
{
for(int j=0;j<=n;j++)
{
for(int k=0;k+j<=n;k+=coin[i])
{
c2[k+j]+=c1[j];
}
}
for(int j=0;j<=n;j++)
c1[j]=c2[j],c2[j]=0;
}
printf("%d\n",c1[n]);
}
return 0;
}
HDU 1085 Holding Bin-Laden Captive!
代码:
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <map>
using namespace std;
#define LL long long
const int N = 300+6;
int vis[9000];
int main()
{
int b[3]={1,2,5};
int a[3];
while(~scanf("%d %d %d",&a[0],&a[1],&a[2]))
{
if(!(a[0]+a[1]+a[2])) break;
int maxx=0;
for(int i=0;i<3;i++)
{
maxx+=a[i]*b[i];
}
memset(vis,0,sizeof vis); vis[0]=1;
for(int i=0;i<3;i++)
{
for(int j=maxx;j>=0;j--)
{
for(int k=0,num=0;num<=a[i];k+=b[i],num++)
{
if(vis[j]) vis[k+j]=1;
}
}
}
for(int i=1;i<=maxx+1;i++)
{
if(vis[i]==0)
{
printf("%d\n",i);
break;
}
}
}
return 0;
}