URAL 1073 Square Country(DP)
大意: 买一块边长为 a 的正方形地需要的钱数是 a^2, 现在输入N为钱的数目,求最少购买地的块数可以凑够N。
思路:DP,由背包思想推出来的dp[i] = min(dp[i], dp[j-i*i]+1); 方块都是由正方形组成的,所以是i*i,循环的时候也是i*i。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 #define min(a, b) ((a) > (b) ? (b) :(a)) 3 4 int n; 5 int dp[60005]; 6 7 int main() 8 { 9 scanf("%d", &n); 10 for(int i = 1; i <= n; ++i){ 11 dp[i] = i; 12 } 13 for(int i = 1; i*i <= n; ++i){ 14 for(int j = i*i; j <= n; ++j){ 15 dp[j] = min(dp[j], dp[j-i*i]+1); 16 } 17 } 18 printf("%d\n", dp[n]); 19 20 return 0; 21 }