dp[i]=min(dp[i-ar[j]]+1,dp[i]);
dp[i]表示第i个数最少需要邮票数
第一个自己想出来的,呵呵,虽然很简单..

View Code
1 #include <stdio.h>
2 #include <algorithm>
3
4 using namespace std;
5
6 int dp[2000005],ar[200];
7
8 int main()
9 {
10 int k,n,i,j;
11 while(scanf("%d%d",&k,&n)!=EOF)
12 {
13 dp[0]=0;
14 for (i=0;i<n;i++)scanf("%d",&ar[i]);
15 sort(ar,ar+n);
16 for (i=1;;i++)
17 {
18 dp[i]=0x3f3f3f3f;
19 for (j=0;j<n;j++)
20 {
21 if(i<ar[j])break;
22 dp[i]=min(dp[i-ar[j]]+1,dp[i]);
23 }
24 if(dp[i]>k)break;
25 }
26 printf("%d\n",i-1);
27 }
28 return 0;
29 }
本文深入探讨了使用动态规划解决邮票问题的算法实现,通过一个具体的代码示例,详细解释了如何计算覆盖给定数值所需的最小邮票数量。算法通过遍历所有可能的邮票组合,找到最优解。
1215

被折叠的 条评论
为什么被折叠?



