Cod sursa(job #1560970)

Utilizator SilviuIIon Silviu SilviuI Data 3 ianuarie 2016 15:43:03
Problema Ghiozdan Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <stdio.h>
#include <algorithm>
#define nmax 75010
#define inf 0x3f3f3f3f

using namespace std;
struct date { int last,nr; };

int n,g,x;
int p[210],dp[nmax];
date path[nmax];

void findpath(int x)
{
	if (x==0) return; else
	{
		for (int i=1;i<=path[x].nr;i++) printf("%d\n",(x-path[x].last)/path[x].nr);
		findpath(path[x].last);
	}
}

int main() 
{
	freopen("ghiozdan.in","r",stdin);
	freopen("ghiozdan.out","w",stdout);
	scanf("%d %d",&n,&g);
	for (int i=1;i<=n;i++) scanf("%d",&x),p[x]++;
	dp[0]=0; 
	for (int i=1;i<=g;i++) dp[i]=inf;
	for (int i=200;i>=1;i--)
	    if (p[i]>0) {
	    	for (int j=g-i;j>=0;j--) 
	    	    if (dp[j]!=inf) {
	    	    	for (int k=1;k<=p[i];k++) {
	    	    		if (j+k*i>g || dp[j+k*i]!=inf) break;
	    	    		if (dp[j+k*i]>dp[j]+k) {
	    	    			dp[j+k*i]=dp[j]+k; path[j+k*i].last=j; path[j+k*i].nr=k; 
						}
					}
				}
		}
	for (int i=g;i>=1;i--)
	    if (dp[i]!=inf) {
	    	printf("%d %d\n",i,dp[i]); findpath(i); break; 
		}
	return 0;
}