P1586 四方定理
题目链接
P1586 四方定理
题解
这道题是经典的01背包
先构造a[i],就是平方数,这是物品大小,n就是背包大小,设f[i]表示背包大小为i能装满的方案
核心如下:
for (int i=1;i<=物品总数;i++) for (int j=a[i];j<=背包最高价值;j++) f[j]+=f[j-a[i]];
f[][]的第二维就是平方数的个数
总结为f[j][k]代表价值上线为j,取k个数作组合时的方案总数。则最后答案为f[n][1]到f[n][4]的和。
代码非常简单,相信大家能看懂。
#include<bits/stdc++.h> using namespace std; int a[185],f[32770][5],m,n; int main() { for(int i=1;i<=181;i++) a[i]=i*i; f[0][0]=1; for (int i=1;i<=181;i++) for (int j=a[i];j<=32768;j++) for(int k=1;k<=4;k++) f[j][k]+=f[j-a[i]][k-1]; cin>>n; for(int i=1;i<=n;i++) { cin>>m; cout<<f[m][1]+f[m][2]+f[m][3]+f[m][4]<<endl; } return 0; }