標籤:os io for amp size type c ios
開一個數組p
若dp[i-1][j]<dp[i-1][j-a[i]]+a[i]時就記錄下p[j]=a[i];表示此時放進一個軌道
遞迴輸出p
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <limits.h>#include <malloc.h>#include <ctype.h>#include <math.h>#include <string>#include<iostream>#include <algorithm>using namespace std;#define MAXN 11111#include <queue>#include <vector>#define IN freopen("in.txt","r",stdin);int a[30],dp[30][MAXN],p[MAXN];void out(int x){ if(x==0) return ; else out(x-p[x]); printf("%d ",p[x]);}int main(){ int n,m; // IN; while(scanf("%d%d",&m,&n)!=EOF) { memset(dp,0,sizeof(dp)); memset(p,0,sizeof(p)); scanf("%d",&n); for(int i=1; i<=n; i++) scanf("%d",&a[i]); for(int i=1; i<=n; i++) { for(int j=m; j>0; j--) { if(j>=a[i]&&dp[i-1][j]<dp[i-1][j-a[i]]+a[i]) dp[i][j]=dp[i-1][j-a[i]]+a[i],p[j]=a[i]; else dp[i][j]=dp[i-1][j]; } } int i; for(i=m;i>=0;i--) if(dp[n][i]>dp[n][i-1]) break; out(i); printf("sum:%d\n",dp[n][m]); } return 0;}