洛谷 P1586 四方定理 题解

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;
}

猜你喜欢

转载自www.cnblogs.com/booksBlog/p/10671818.html
今日推荐