题意 输入两个数 len,n 表示长度和个数,接下来输入n个数, 表示每一个的长度, 求这n个数能够组成的不超过len的最大长度,并输出这些数。
分析:01背包,dp数组非0表示可以组成的数,dp数组用来记录路径
#include <iostream> #include <queue> #include <cstdio> #include <cstring> #include <cstdlib> #include <stack> #include <algorithm> using namespace std; const int maxn = 2005; int a[22]; int dp[maxn]; int main() { int len, n; while(~scanf("%d%d", &len, &n)) { memset(dp, 0, sizeof(dp)); for(int i=1; i<=n; i++) { scanf("%d", &a[i]); } dp[0] = 1; int Max = 0; for(int i=n; i>=1; i--) { for(int j=len; j>=a[i]; j--) { if(dp[j-a[i]]&&dp[j]==0) { dp[j] = a[i]; } } } while(dp[len]==0) len--; Max = len; while(len) { printf("%d ", dp[len]); len -= dp[len]; } printf("sum:%d\n", Max); } return 0; }
原文:http://www.cnblogs.com/mengzhong/p/5459687.html