洛谷 P1586 四方定理
这题是完全背包问题。背包容量变成了最后的平方和。装进背包的物品为各个平方数。且可以取无限个。
dp[i][j]+=dp[i−k∗k][j−1]。i为平方和。j为由几个数组成的这个平方和。
最后答案为j=1~4的和。
(又是一道看了题解才会的题)
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; typedef long long ll; int t,n,cnt,dp[33000][5]; int main(){ dp[0][0]=1; for(int i=1;i*i<=32768;i++) for(int j=i*i;j<=32768;j++) for(int k=1;k<=4;k++) dp[j][k]+=dp[j-i*i][k-1]; scanf("%d",&t); while(t--){ scanf("%d",&n); cnt=0; for(int i=1;i<=4;i++) cnt+=dp[n][i]; printf("%d\n",cnt); } return 0; }

浙公网安备 33010602011771号