【发布时间】:2015-07-22 04:58:12
【问题描述】:
正如问题所述,我们得到一个正整数 M 和一个非负整数 S。我们必须找到长度为 M 和数字总和为 S 的数字中的最小和最大。
约束:
(S>=0 和 S
(M>=1 和 M
我想了想,得出的结论一定是动态编程。但是我没有建立DP状态。
这是我的想法:-
dp[i][j]=总和为“j”的前“i”位数字
并尝试制作程序。这是它的样子
/*
*** PATIENCE ABOVE PERFECTION ***
"When in doubt, use brute force. :D"
-Founder of alloj.wordpress.com
*/
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define nline cout<<"\n"
#define fast ios_base::sync_with_stdio(false),cin.tie(0)
#define ull unsigned long long int
#define ll long long int
#define pii pair<int,int>
#define MAXX 100009
#define fr(a,b,i) for(int i=a;i<b;i++)
vector<int>G[MAXX];
int main()
{
int m,s;
cin>>m>>s;
int dp[m+1][s+1];
fr(1,m+1,i)
fr(1,s+1,j)
fr(0,10,k)
dp[i][j]=min(dp[i-1][j-k]+k,dp[i][j]); //Tried for Minimum
cout<<dp[m][s]<<endl;
return 0;
}
请指导我这个 DP 状态以及程序的时间复杂度。这是我第一次尝试 DP。
【问题讨论】:
-
这里不需要dp,是贪心算法
-
Exactly Greedy 是一种更好的方法,只需找到具有此属性的数字,然后对数字进行递增或递减排序。