这些题都可以用动规或者背包做
HDU1028
HDU1398
HDU2079
HDU2082
HDU1028 #include<cstdio> #include<cstdlib> #include<iostream> #include<memory.h> using namespace std; int c1[330],c2[330],ans[330]; int n,i,j,m,k; void _get() { for(i=0;i<=120;i++) { c1[i]=1;c2[i]=0; } ans[1]=1; for(i=2;i<=120;i++){ for(j=0;j<=120;j++) for(k=0;k+j<=120;k+=i) c2[k+j]+=c1[j]; for(k=0;k<=120;k++) { c1[k]=c2[k];c2[k]=0;} ans[i]=c1[i]; } } int main() { _get(); while(cin>>n) cout<<ans[n]<<endl; return 0; } HDU1398 #include<cstdio> #include<cstdlib> #include<iostream> #include<memory.h> #include<algorithm> #include<cmath> using namespace std; long long c1[310],c2[310],ans; void _get(int v) { int i,j,k; for(i=0;i<=v;i++) { c1[i]=0;c2[i]=0;} c1[0]=1; for(i=1;i<=17;i++){ int tmp=i*i; for(j=0;j<=v;j++) for(k=0;j+k*tmp<=v;k++) c2[j+k*tmp]+=c1[j]; for(k=0;k<=v;k++) { c1[k]=c2[k]; c2[k]=0; } } ans=c1[v]; } int main() { int n; while(~scanf("%d",&n)){ if(n==0) return 0; _get(n); printf("%lld ",ans); } return 0; } HDU2079 #include<cstdio> #include<cstdlib> #include<iostream> #include<map> #include<memory.h> #include<algorithm> using namespace std; int c1[1160],c2[1160]; int x[300]; int main() { int T,n,i,j,k,K,ans; cin>>T; while(T--) { ans=0; cin>>n>>K; memset(c1,0,sizeof(c1)); memset(c2,0,sizeof(c2)); memset(x,0,sizeof(x)); for(i=1;i<=K;i++){ scanf("%d%d",&j,&k); x[j]+=k; } for(i=0;i<=x[1];i++) c1[i]=1; for(i=2;i<=8;i++) { for(j=0;j<=n;j++) for(k=0;(k<=x[i])&&((j+k*i)<=n);k++) c2[j+k*i]+=c1[j]; for(k=0;k<=n;k++){ c1[k]=c2[k]; c2[k]=0; } } printf("%d ",c1[n]); } return 0; } HDU2082 #include<cstdio> #include<cstdlib> #include<iostream> #include<map> #include<memory.h> #include<algorithm> using namespace std; int c1[1160],c2[1160]; int x[300]; int main() { int T,n,i,j,k,ans; cin>>T; while(T--) { ans=0; memset(c1,0,sizeof(c1)); memset(c2,0,sizeof(c2)); for(i=1;i<=26;i++) scanf("%d",&x[i]); for(i=0;i<=min(50,x[1]);i++) c1[i]=1; for(i=2;i<=26;i++) { for(j=0;j<=50;j++) for(k=0;(k<=x[i])&&((j+k*i)<=50);k++) c2[j+k*i]+=c1[j]; for(k=0;k<=50;k++){ c1[k]=c2[k]; c2[k]=0; } } for(i=1;i<=50;i++) ans+=c1[i]; printf("%d ",ans); } return 0; }