思路:找到只有一个儿子的父亲为n个,2^n即可。
#include <stdio.h>
#include <string.h>
int main()
{
char q[1000],h[1000];
int s=1;
scanf("%s%s",q,h);
for(int i=0;i<strlen(q);i++)
{
for(int j=0;j<strlen(h);j++)
{
if(q[i]==h[j]&&q[i+1]==h[j-1]&&i+1<strlen(q)&&j-1>=0)
s*=2;
}
}
printf("%d\n",s);
return 0;
}
先并查,再把价值和价钱相加,用背包找到最大价值。
代码如下:
#include<stdio.h>
int a[10000],b[10000],c[10000],d[10000],l[10000],max=-1,dp[1000000000];
//double xjb[10000];
int bj(int k)
{
if(a[k]==k) return k;
return a[k]=bj(a[k]);
}
//void dfs(int money1,int jz1,int zj,int sl,int ly)
//{
// if(money1>zj) return ;
// if(jz1>max)
// max=jz1;
// for(int k=ly+1;k<=sl;k++){
// dfs(money1+d[k],jz1+l[k],zj,sl,k);
// }
//}
int mx(int a11,int b11)
{
if(a11>b11)
return a11;
return b11;
}
int main()
{
int q,w,e;
scanf("%d%d%d",&q,&w,&e);
for(int i=1;i<=q;i++)
a[i]=i;
for(int i=1;i<=q;i++)
scanf("%d%d",&b[i],&c[i]);
for(int i=1;i<=w;i++){
int t,y;
scanf("%d%d",&t,&y);
a[bj(t)]=bj(y);
}
for(int i=1;i<=q;i++){
for(int j=1;j<=q;j++){
if(a[bj(i)]==bj(j)){
d[i]+=b[j];
l[i]+=c[j];
}
}
}
for(int i=1;i<=q;i++){
if(a[i]==i){
for(int j=e;j>=d[i];j--){
dp[j]=mx(dp[j],dp[j-d[i]]+l[i]);
}
}
}
// int q1=1;
// for(int i=1;i<=q;i++)
// {
// if(a[i]==i&&d[i]<=e)
// {
// a[q1]=i;
// d[q1]=d[i];
// l[q1]=l[i];
// q1++;
// }
// }
// for(int i=1;i<q1;i++){
// xjb[i]=l[i]/d[i];
// }
// for(int i=1;i<q1-1;i++){
// for(int j=i+1;j<q1;j++){
// if(xjb[i]<xjb[j]){
// int temp=xjb[i];
// xjb[i]=xjb[j];
// xjb[j]=temp;
// temp=l[i];
// l[i]=l[j];
// l[j]=temp;
// temp=d[i];
// d[i]=d[j];
// d[j]=temp;
// }
// }
// }
// if(q1<20){
// for(int i=1;i<q1;i++){
// int money=d[i],jz=l[i];
// dfs(money,jz,e,q1,i);
// }
// }
// else{
// for(int i=1;i<q1/3;i++){
// int money=d[i],jz=l[i];
// dfs(money,jz,e,q1/3,i);
// }
// }
// int money=0;
// for(int i=1;i<q1;i++){
// if(money+d[i]<=e){
// money+=d[i];
// max+=l[i];
// }
// }
// for(int i=1;i<q1;i++){
// printf("%d %lf %d %d %d\n",i,xjb[i],a[i],d[i],l[i]);
// }
// if(max!=-1)
// max+=1;
printf("%d",dp[e]);
return 0;
}