http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1520
DP题。
这题的意思就是找一个最接近M的解,然后将其余部分与L对比。
由于,M,L均小于1000,且n<M+L < 2000 , 所以直接用数组不会有任何问题。
不过,我在做的时候偷懒了,在DP以及输出结果的时候,用了一些低效率的做法
#include <cstdio>
#include <algorithm>
using namespace std;
int c[1001];
int p[2001];
int s[2001];
int sum;
int main(){
int M,L,n,v;
while(scanf("%d%d",&M,&L) == 2 ){
if(M == 0 && L == 0)
break;
sum =0;
for(int i=0;i<=M;i++) c[i] = 0;
c[0] = 1;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&v);
p[i] = v;
sum += v;
for(int j=M-v;j>=0;j--)if(c[j] && c[j+v] == 0) c[j+v] = i;
//printf("\n");
}
for(v = M;v>0 && c[v] == 0;v--);
if(sum - v > L){
printf("Impossible to distribute\n");
}else{
int i=0;
//p[s[v]]
while(v>0){
s[i++] = c[v];
v = v - p[c[v]];
}
sort(s,s+i);
printf("%d",i);
for(int j=0;j<i;j++)
printf(" %d",s[j]);
printf("\n");
}
}
return 0;
}