我的大概比较适合初学者看~ /* ID: lingxiu1 LANG: C++ TASK: stamps */ #include<stdio.h> #include<string.h> #include<limits.h> #include<iostream> #include<algorithm> using namespace std; int dp[2000001] ;//dp[i]:表示面值为i的邮票需要的最少邮票数 int v[101] ; //面值 int main(){ freopen("stamps.in","r",stdin); freopen("stamps.out","w",stdout); int N, K, i, j; memset(dp, -1, sizeof(dp)) ; //初始化为-1 scanf("%d%d", &K, &N) ; for(i = 0; i < N; i ++) { scanf("%d", &v[i]) ; dp[v[i]] = 1 ;//1表示可以用1张组成 } for(i = 1; ; i ++) { for(j = 0; j < N; j ++) { if(v[j] > i || dp[i-v[j]] == -1) //等于-1说明无法组成该面值 { continue ; } if(dp[i] == -1) dp[i] = INT_MAX ; dp[i] = min(dp[i], dp[v[j]] + dp[i-v[j]]) ; //在所有组成方式中找需要邮票数最少的 } if(dp[i] == -1 || dp[i] > K) break ;//如果无法组成或大于K,跳出循环 } printf("%d/n", i-1); return 0; }