Step 1 Problem:
给你n块钱,让你去买地(每块地都是正方形),而且它的花费是a*a(a边长)。问这些钱最少能买到几块地,且钱得正好用完。
Step 2 Involving algorithms:
完全背包
Step 3 Ideas:
其实就是一道很裸的完全背包,要求最少能买几块地,那么dp数组初始化为inf,状态转移方程求最小即可。钱一定可以正好用完
Step 4 Code:
#include<bits/stdc++.h>
using namespace std;
const int up = 244;
const int inf = 0x3f3f3f3f;
int dp[60055];
int main()
{
int n;
while(cin >> n)
{
memset(dp, inf, sizeof(dp));
dp[0] = 0;
for(int i = 1; i <= 244; i++)
{
for(int j = i*i; j <= n; j++)
{
dp[j] = min(dp[j], dp[j - i*i] + 1);
}
}
cout << dp[n] << endl;
}
return 0;
}