struct node* next_larger(struct node* current) { struct node* parent = NULL; if (current == NULL) reutrn NULL; if (current->right != NULL) return mininum(current); else parent = current->parent; while (current != NULL && current == parent->right) { current = parent; parent = parent->parent; } return parent; }
void MiniSpanTree_Prim(MGraph &G,VertexType v) { int i,j,k,t; closedge close; k=LocateVex(G,v);//第一个顶点标记为访问 for(j=0;j<G.vexnum;j++) if(j!=k) close[j].lowcost=G.arcs[k][j].adj; close[k].lowcost=0; for(i=1;i<G.vexnum;i++) { k=mininum(G,G.vexs[k],close); printf("(%d---->%d)\n",close[k].adjvex,G.vexs[k]); close[k].lowcost=0; for(j=k;j<G.vexnum;j++)//找处当前各个点的最小边 if(G.arcs[k][j].adj<=close[j].lowcost) close[j].lowcost=G.arcs[k][j].adj; } }
int main() { int coin_num,chang_money; int coin[11]; int table[11][64001]; int i,j; int temp; int min=-1; scanf("%d",&coin_num); for(i=0;i<coin_num;i++) { scanf("%d",&coin[i]); } scanf("%d",&chang_money); for(i=0;i<=coin_num;i++) { table[i][0]=0; } for(i=0;i<=chang_money;i++) { table[0][i]=0; } for(i=1;i<=coin_num;i++) { for(j=1;j<=chang_money;j++) { temp=((j/coin[i-1])*coin[i-1]); if(temp+((j-temp)*table[i-1][j-temp])==j) { table[i][j]=mininum((j/coin[i-1])+table[i-1][j-temp],table[i-1][j]); } else { table[i][j]=table[i-1][j]; } } } /* for(i=0;i<=coin_num;i++) { for(j=0;j<=chang_money;j++) { printf("%d ",table[i][j]); } printf("\n"); } */ for(i=0;i<=coin_num;i++) { printf("%d\n",table[i][chang_money]); } for(i=1;i<=coin_num;i++) { if(min!=-1) { if(table[i][chang_money]<min) { min=table[i][chang_money]; } } else { if(table[i][chang_money]!=0) { min=table[i][chang_money]; } } } if(min!=-1) { printf("%d",min); } else { printf("impossible"); } return 0; }