`
nubix
  • 浏览: 89899 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

zju 1520 Duty Free Shop

阅读更多

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;
}
 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics