题目:给不一组数,以及一个目标值,选出相加后最接近这个值得数,每个数用1次
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
int n,tn;
const int maxn = 10005;
int t[25];
int dp[maxn];
int path[25][maxn];
int main() {
int i,j;
while(scanf("%d", &n) != EOF) {
scanf("%d", &tn);
for(i=0; i<tn; i++) {
scanf("%d", &t[i]);
}
memset(dp, 0, sizeof(dp));
memset(path, 0, sizeof(path));
int flag;
for(i=0; i<tn; i++)
for(j=n; j>=t[i]; j--) {
if(dp[j]<dp[j-t[i]]+t[i]) {
dp[j] = dp[j-t[i]]+t[i];
path[i][j] = 1;
}
}
for(i=tn, j=n; i>=0; i--) {
if(path[i][j]) {
printf("%d ",t[i]);
j -= t[i];
}
}
printf("sum:%d\n", dp[n]);
}
return 0;
}