裸的01背包.dp[x]只要是bool型记录当前空间是否可用..
而为了找到用了哪些物品..dp[x]设置为int型..进行记录..
Program:
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<cmath> #define oo 1000000007 #define ll long long #define pi acos(-1.0) #define MAXN 20005 using namespace std; int M,L,N,w[MAXN],dp[MAXN],ans[MAXN]; bool used[MAXN]; int main() { // freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); int i,j,x,num,sum; while (~scanf("%d%d",&M,&L)) { if (!M && !L) break; scanf("%d",&N); memset(dp,-1,sizeof(dp)); sum=0; dp[0]=0; for (i=1;i<=N;i++) scanf("%d",&w[i]); for (i=1;i<=N;i++) { x=w[i]; sum+=x; for (j=M-x;j>=0;j--) if (dp[j]!=-1 && dp[j+x]==-1) dp[j+x]=i; } for (;M>=0;M--) if (sum-M<=L && dp[M]!=-1) { x=M; num=0; while (x) { ans[++num]=dp[x]; x=x-w[dp[x]]; } printf("%d",num); for (i=num;i>=1;i--) printf(" %d",ans[i]); break; } if (M<0) printf("Impossible to distribute"); printf("\n"); } return 0; }